题意:
      这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少.

思路:(prim+树形dp)

      先跑一边最小树(建议用普利姆,别用克鲁斯卡尔,虽然网上有用k过的,但我感觉理论上会超时 n*n*nlog(n)/2),然后树形dp跑出任意两个集合之间的最有替代边.(n^2),然后当每次输入一条要该边的边的时候,先判断先是不是最小树上的边,如果不是那么sum直接加最小树,如果是那么就用sum - dis[u][v] + min(dis ,dp[u][v]);就是用原边和不用原边的最小值,记住此时的原边权值已经改变....


#include<stdio.h>
#include<string.h>
#include<algorithm>#define N (3000 + 100)
#define inf 9223372036854775807

using namespace std;typedef struct
{int to ,next;
}STAR;STAR E[N*2];
int list[N] ,tot;
double map[N][N];
double dp[N][N];void add(int a ,int b)
{E[++tot].to = b;E[tot].next = list[a];list[a] = tot;E[++tot].to = a;E[tot].next = list[b];list[b] = tot;
}double minn(double a ,double b)
{return a < b ? a : b;
}double DFS_T_DP(int p ,int s ,int f)
{double now = inf;for(int k = list[s] ;k ;k = E[k].next) {int to = E[k].to;if(to == f) continue;double tmp = DFS_T_DP(p ,to ,s);now = minn(tmp ,now);dp[s][to] = dp[to][s] = minn(dp[s][to] ,tmp);}  if(f != p)now = minn(now ,map[p][s]);return now;
}struct PRIM //从0开始用
{           double d[N];int vis[N];  bool mp[N][N];  //标记最小生成树上的边
   double ans;//最小树
   int n;//点的个数                           记得初始化    ***
   double dis[N][N]; // 距离                  记得初始化  *****
   void prim()
{ for(int i=0;i<n;i++){  vis[i]=0;  d[i]=dis[0][i];  }  vis[0]=-1;  ans=0;  memset(mp,0,sizeof(mp));  for(int i=1;i<n;i++){  double Min= inf;  int node=-1;  for(int j=0;j<n;j++){  if(vis[j]!=-1 && d[j]<Min){  node=j;  Min=d[j];  }  }  ans+=Min;  mp[vis[node]][node]=mp[node][vis[node]]=1;  add(vis[node],node); // 建树
        vis[node]=-1;  for(int j=0;j<n;j++){  if(vis[j]!=-1 && d[j]>dis[node][j]){  vis[j]=node;  d[j]=dis[node][j];  }  }  }  }
}P;int main ()
{int n ,m ,q ,i ,j ,a ,b;double dis;while(~scanf("%d %d" ,&n ,&m) && n + m){for(i = 0 ;i <= n ;i ++){for(j = i + 1 ;j <= n ;j ++)P.dis[i][j] = P.dis[j][i] = map[i][j] = map[j][i] = dp[i][j] = dp[j][i] = inf;P.dis[i][i] = P.dis[i][i] = map[i][i] = map[i][i] = 0;}for(i = 1 ;i <= m ;i ++){scanf("%d %d %lf" ,&a ,&b ,&dis);map[a][b] = map[b][a] = dis;P.dis[a][b] = P.dis[b][a] = dis;}P.n = n;memset(list ,0 ,sizeof(list));tot = 1;P.prim();double T_sum = P.ans;for(i = 0 ;i < n ;i ++)DFS_T_DP(i ,i ,-1);double ans_sum = 0;
      scanf("%d" ,&q);    for(i = 1 ;i <= q ;i ++){scanf("%d %d %lf" ,&a ,&b ,&dis);double now;if(!P.mp[a][b])now = T_sum ;
         else{if(dis > dp[a][b])now = T_sum - map[a][b] + dp[a][b] ;
            elsenow = T_sum - map[a][b] + dis ;
         }
         ans_sum += now;}printf("%.4lf\n" ,ans_sum / q);}return 0;
}

hdu4126(MST + 树形dp相关推荐

  1. HDU 4126 Genghis Khan the Conqueror MST + 树形DP 2011年福州现场赛F题

    题目大意: 就是现在给出一个图, N个点, M条边, N <= 3000, M <= N*N, 但是没有重边, 每条边都有一个权值, 图中没有自环 现在给出Q次询问, 每次询问表示如果更改 ...

  2. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  3. BSOJ2923 CODEVS1419 藤原妹红 最小生成树+树形dp

    2923 -- [模拟试题]藤原妹红 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民.由于妹红算得上是幻想乡最强的人类,对于她 ...

  4. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  5. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  6. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  7. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  8. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  9. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

最新文章

  1. 2021年大数据ELK(一):集中式日志协议栈Elastic Stack简介
  2. FPGA锁存器、触发器、寄存器和缓冲器的区别
  3. Linux之自动化部署
  4. oracle迁移postsql的,osdba's blog : Oracle迁移PostgreSQL系列文章之二:merge语句
  5. Class类 获取Class对象
  6. zsh性能分析(没搞完)
  7. 《D3.js数据可视化实战手册》—— 1.1 简介
  8. vector中的reserve() 与 resize()
  9. OJ1083: 数值统计(多实例测试)(C语言)
  10. DC漫画公司正在考虑进军NFT市场
  11. Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.2.2:testCompile问题解决
  12. Visual Studio 2012正式版官方下载地址
  13. docker容器别人访问很卡_docker容器下远程访问jupyter的方式
  14. 安装docker 17.03.2.ce教程
  15. Java游戏编程不完全详解-2(1万2千字吐血推荐)
  16. C#控件中使用DirectX
  17. 巴厘岛最全的美食攻略
  18. 文件编码格式转换工具
  19. 状态码 https dns解析过程
  20. 如何用python写脚本_python写脚本

热门文章

  1. OpenCV成长之路:图像滤波
  2. 菜鸟学Java(十一)——GET与POST
  3. Dynamips和Vmware完成CCVP试验(1)
  4. 石川es6课程---5、函数-参数
  5. 使用Python内置函数对变量类型进行转换
  6. oracle数据库访问order by不起作用分析
  7. 【Android】Mac Android adb 配置
  8. Linux系统CentOS下mysql的安装日志
  9. Replication的犄角旮旯(五)--关于复制identity列
  10. 赴美工作常识(Part 4 - 面试)