链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679

题意:给定一颗树,每条边有一个权值w,问切掉哪条边之后,分成的两颗树的较大的直径*切掉边的权值最小?如果存在多条边使得结果相同,输出边id最小的

思路:

dept一次找出最深的节点,之后以最深的节点出发(rt1)dept找到树的直径(即找到rt2);将路径保存在f[]中;

之后分别从rt1/rt2进行深搜,找到以一个节点为根的树的直径,这样在每次dfs之后,可以求出每条边的一边的最值,这样两次取max之后就求出了切掉该边之后得到的结果

注:

如果改变在整棵树的直径上,需要取出以该棵树为根的树的直径maxn[0][v];否则就直接取整棵树的直径即可;

在dfs递推出以某根为子树的直径时,可能直径不过根节点所以要将子子树的直径递推到子树上;

  1. #include<bits/stdc++.h>
  2. #pragma comment(linker, "/STACK:1024000000,1024000000") //加栈
  3. using namespace std;
  4. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  5. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  6. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  7. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  8. #define MS0(a) memset(a,0,sizeof(a))
  9. #define MS1(a) memset(a,-1,sizeof(a))
  10. #define MSi(a) memset(a,0x3f,sizeof(a))
  11. #define inf 0x3f3f3f3f
  12. #define lson l, m, rt << 1
  13. #define rson m+1, r, rt << 1|1
  14. typedef pair<int,int> PII;
  15. #define A first
  16. #define B second
  17. #define MK make_pair
  18. typedef long long ll;
  19. typedef unsigned int uint;
  20. template<typename T>
  21. void read1(T &m)
  22. {
  23. T x=,f=;char ch=getchar();
  24. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  25. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  26. m = x*f;
  27. }
  28. template<typename T>
  29. void read2(T &a,T &b){read1(a);read1(b);}
  30. template<typename T>
  31. void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
  32. template<typename T>
  33. void out(T a)
  34. {
  35. if(a>) out(a/);
  36. putchar(a%+'');
  37. }
  38. #define N 100007
  39. int head[N<<],tot;
  40. struct edge{
  41. int to,w,id,Next;
  42. }e[N<<];
  43. void ins(int a,int b,int w,int id)
  44. {
  45. e[++tot].Next = head[a];
  46. e[tot].to = b;
  47. e[tot].w = w;
  48. e[tot].id = id;
  49. head[a] = tot;
  50. }
  51. int dep[N],p[N];
  52. void dept(int u,int pre)
  53. {
  54. p[u] = pre;
  55. dep[u] = dep[pre] + ;
  56. for(int id = head[u];id;id = e[id].Next){
  57. int v = e[id].to;
  58. if(v == pre) continue;
  59. dept(v,u);
  60. }
  61. }
  62. int f[N],maxlen;//树的直径
  63. int aux[N];
  64. int maxn[][N];
  65. void dfs(int u,int pre)
  66. {
  67. maxn[][u] = maxn[][u] = maxn[][u] = ;
  68. for(int id = head[u];id;id = e[id].Next){
  69. int v = e[id].to;
  70. if(v == pre) continue;
  71. dfs(v,u);
  72. if(maxn[][u] <= maxn[][v]+){
  73. maxn[][u] = maxn[][u];
  74. maxn[][u] = maxn[][v]+;
  75. }else if(maxn[][u] < maxn[][v]+)
  76. maxn[][u] = maxn[][v]+;
  77. if(maxn[][u] < maxn[][v]) //**可能树的直径不过根节点;
  78. maxn[][u] = maxn[][v];
  79. }
  80. maxn[][u] = max(maxn[][u],maxn[][u] + maxn[][u]); //以u为根的子树的直径
  81. }
  82. void solve(int u,int pre)
  83. {
  84. for(int id = head[u];id;id = e[id].Next){
  85. int v = e[id].to, w = e[id].w;
  86. if(v == pre) continue;
  87. if(f[u] && f[v]){ //边在直径上
  88. aux[e[id].id] = max(aux[e[id].id],w*maxn[][v]);
  89. }else{
  90. aux[e[id].id] = max(aux[e[id].id],w*maxlen);
  91. }
  92. solve(v,u);
  93. }
  94. }
  95. int main()
  96. {
  97. //freopen("data.txt","r",stdin);
  98. //freopen("out.txt","w",stdout);
  99. int kase = ,T,n;
  100. read1(T);
  101. while(T--){
  102. MS0(head);tot = ;
  103. MS0(f);
  104. read1(n);
  105. rep0(i,,n){
  106. int u,v,w;
  107. read3(u,v,w);
  108. ins(u,v,w,i);ins(v,u,w,i);
  109. }
  110. dep[] = ;
  111. dept(,);
  112. int rt1 ,rt2 ,d = ;
  113. rep1(i,,n) if(d < dep[i]) d = dep[i],rt1 = i;
  114. dept(rt1,);
  115. d = ;
  116. rep1(i,,n) if(d < dep[i]) d = dep[i],rt2 = i;
  117. maxlen = d-; //求出树的直径;以及两端的节点标号
  118. int index = rt2;
  119. while(index){
  120. f[index] = ;
  121. index = p[index]; //从树直径的终点递推到起点
  122. }
  123. MS0(aux);
  124. dfs(rt1,-);
  125. solve(rt1,);
  126. dfs(rt2,-);
  127. solve(rt2,);
  128. int ans = inf;
  129. rep0(i,,n){
  130. if(ans > aux[i]) ans = aux[i],index = i;
  131. }
  132. printf("Case #%d: %d\n",kase++,index);
  133. }
  134. return ;
  135. }

hdu 4679 Terrorist’s destroy 树形DP的更多相关文章

  1. HDU 4679 Terrorist’s destroy (2013多校8 1004题 树形DP)

    Terrorist’s destroy Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  2. HDU-4679 Terrorist’s destroy 树形DP,维护

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w ...

  3. hdu 4679 Terrorist’s destroy 树的直径+dp

    题意:给你一棵树,每条边都有值W,然后问你去掉一条边,令val = w*max(两颗新树的直径),求val最小值~ 做法,先求树的直径,然后算出直径上每个点的最长枝条长度.这样对于每一条边,假如是枝条 ...

  4. HDU 4679 Terrorist’s destroy

    如果不在最长路的边,那么肯定是w*最长路. 如果在最长路,那么把最长路分成两段,左边树的最长路就是左段+左边点的次短路(不包含最长路上的点的最长路) ,右边同理. 还有就是更新,经过左端点的最长路,不 ...

  5. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  6. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  7. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  8. hdu 4003 Find Metal Mineral 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...

  9. HDU 5758 Explorer Bo(树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...

随机推荐

  1. cocos2d-x中使用Http

    一.如何使用 //发送接口 void CmdHelper::postRequest(const char* cmdTag, const char* url, const char* postData, ...

  2. SQLServer-镜像配置

    实验环境:三台服务器分别为主服务器,镜像服务器,见证服务器,都加入域sql.com 1. 分别在三台服务器上安装SQL 2008 R2,安装数据库引擎和管理工具两个组件即可. 2. 镜像前准备工作. ...

  3. iaas,paas,saas理解

    IaaS.PaaS.SaaS多次看到这几个单词,今天仔细看看来, ​这几个词和云计算相关:1,iaaS,Hardware-as-a-Service,信息,硬件服务,服务器,存储和网络硬件,网络存储,带 ...

  4. LeetCode 122

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  5. Netbackup备份失败:ORA-19506 ORA-27028 ORA-19511

    Netbackup之前备份RAC数据一直都非常正常,突然这几天出现异常: channel ch00: starting piece 1 at 2013-11-24:18:02:32released c ...

  6. 学习28个HTML5特征、窍门和技术

    当下,H5火热得不行,写下这篇文章,认真的认识下HTML5. HTML5最早应该是09年左右被提出,然而当时受浏览器兼容性的影响,一直没得到普遍应用,最近也是因为移动端的发展,带动HTML5. 回归正 ...

  7. HTTPClient模块的HttpGet和HttpPost

    HttpClient常用HttpGet和HttpPost这两个类,分别对应Get方式和Post方式. 无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源. 1.创 ...

  8. JAVA语法之小结

    对于JAVA的语法,我做了个小节: 类名:所有类名称首字母大写,如果由几个单词组成,那么组合内的第一个单词首字母应当大写,可以包括数字但是不能以数字开头. 方法名:方法没应当小写,如果由几个单词组成, ...

  9. 搜索本地网络内所有可用的SQl实例

    '搜索本地网络内所有可用的SQl实例 Dim instance As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance Dim dt ...

  10. 在WCF中使用Flag Enumerations

      请看MSDN示例: [DataContract][Flags] public enum CarFeatures {     None = 0,     [EnumMember]     AirCo ...