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

  题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w*Min(a,b)最小。。

  说白了就是要枚举每条边,然后在O(1)的时间内求出两颗子树的最长链。因此我们可以考虑用树形DP,首先一遍DFS,对于每个节点维护两个信息,hign[u]:u为根节点的子树的深度,f[u]:u为根节点的子树的最长链。然后还要维护一个hige[i][0]和hige[i][1],分别表示u为根节点的子树,不包括边 i 的深度和最长链。然后再一遍DFS,根据上一节点的信息递推过去就可以在O(1)的时间内求出来了,总复杂度O(E)。有些细节要考虑,开始把全局变量搞混,wa了几次T^T。。

  1. //STATUS:C++_AC_875MS_11012KB
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. //#include <ext/rope>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <numeric>
  10. #include <cstring>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <string>
  14. #include <vector>
  15. #include <bitset>
  16. #include <queue>
  17. #include <stack>
  18. #include <cmath>
  19. #include <ctime>
  20. #include <list>
  21. #include <set>
  22. #include <map>
  23. using namespace std;
  24. #pragma comment(linker,"/STACK:102400000,102400000")
  25. //using namespace __gnu_cxx;
  26. //define
  27. #define pii pair<int,int>
  28. #define mem(a,b) memset(a,b,sizeof(a))
  29. #define lson l,mid,rt<<1
  30. #define rson mid+1,r,rt<<1|1
  31. #define PI acos(-1.0)
  32. //typedef
  33. typedef __int64 LL;
  34. typedef unsigned __int64 ULL;
  35. //const
  36. const int N=1;
  37. const int INF=0x3f3f3f3f;
  38. const LL MOD=,STA=;
  39. const LL LNF=1LL<<;
  40. const double EPS=1e-;
  41. const double OO=1e50;
  42. const int dx[]={-,-,,,,,,-};
  43. const int dy[]={,,,,,-,-,-};
  44. const int day[]={,,,,,,,,,,,,};
  45. //Daily Use ...
  46. inline int sign(double x){return (x>EPS)-(x<-EPS);}
  47. template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
  48. template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
  49. template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
  50. template<class T> inline T Min(T a,T b){return a<b?a:b;}
  51. template<class T> inline T Max(T a,T b){return a>b?a:b;}
  52. template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
  53. template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
  54. template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
  55. template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
  56. //End
  57.  
  58. struct Edge{
  59. int u,v,w,id;
  60. }e[N<<];
  61. int first[N],next[N<<],hign[N],hige[N<<][];
  62. int f[N],maxl1[N],maxr1[N],maxl2[N],maxr2[N],maxlf[N],maxrf[N],d[N],w[N];
  63. int n,mt;
  64. int T,ans,ansid;
  65.  
  66. void adde(int a,int b,int c,int id)
  67. {
  68. e[mt].u=a,e[mt].v=b,e[mt].w=c,e[mt].id=id;
  69. next[mt]=first[a];first[a]=mt++;
  70. e[mt].u=b,e[mt].v=a,e[mt].w=c,e[mt].id=id;
  71. next[mt]=first[b];first[b]=mt++;
  72. }
  73.  
  74. void dfs1(int u,int fa)
  75. {
  76. int i,j,v,cnt=,flag=;
  77. f[u]=;
  78. for(i=first[u];i!=-;i=next[i]){
  79. if((v=e[i].v)==fa)continue;
  80. dfs1(v,u);
  81. f[u]=Max(f[u],f[v]);
  82. flag=;
  83. }
  84. if(!flag){f[u]=hign[u]=;return;}
  85. for(i=first[u];i!=-;i=next[i]){
  86. if((v=e[i].v)==fa)continue;
  87. w[cnt]=v;
  88. d[cnt++]=hign[v]+;
  89. }
  90. maxl1[]=maxr1[cnt]=maxl2[]=maxr2[cnt]=maxlf[]=maxrf[cnt]=;
  91. for(i=;i<cnt;i++){
  92. maxlf[i]=Max(maxlf[i-],f[w[i]]);
  93. maxl1[i]=maxl1[i-],maxl2[i]=maxl2[i-];
  94. if(d[i]>maxl1[i])maxl2[i]=maxl1[i],maxl1[i]=d[i];
  95. else if(d[i]>maxl2[i])maxl2[i]=d[i];
  96. }
  97. for(i=cnt-;i>;i--){
  98. maxrf[i]=Max(maxrf[i+],f[w[i]]);
  99. maxr1[i]=maxr1[i+],maxr2[i]=maxr2[i+];
  100. if(d[i]>maxr1[i])maxr2[i]=maxr1[i],maxr1[i]=d[i];
  101. else if(d[i]>maxr2[i])maxr2[i]=d[i];
  102. }
  103. for(j=,i=first[u];i!=-;i=next[i]){
  104. if(e[i].v==fa)continue;
  105. hige[i][]=Max(maxl1[j-],maxr1[j+]);
  106. hige[i][]=Max(maxl1[j-]+maxr1[j+],
  107. maxl1[j-]+maxl2[j-],maxr1[j+]+maxr2[j+]);
  108. hige[i][]=Max(hige[i][],maxlf[j-],maxrf[j+]);
  109. j++;
  110. }
  111. f[u]=Max(f[u],maxr1[]+maxr2[]);
  112. hign[u]=maxr1[];
  113. }
  114.  
  115. void dfs2(int u,int fa,int max1,int max2)
  116. {
  117. int i,j,v,t1,t2,nt;
  118. for(i=first[u];i!=-;i=next[i]){
  119. if((v=e[i].v)==fa)continue;
  120. t1=Max(hige[i][],max2,max1+hige[i][]);
  121. nt=Max(f[v],t1)*e[i].w;
  122. if(ans>nt || (ans==nt && e[i].id<ansid)){
  123. ans=nt;
  124. ansid=e[i].id;
  125. }
  126. t2=Max(max1,hige[i][])+;
  127. dfs2(v,u,t2,Max(t1,t2));
  128. }
  129. }
  130.  
  131. int main(){
  132. // freopen("in.txt","r",stdin);
  133. int i,j,a,b,c,ca=;
  134. scanf("%d",&T);
  135. while(T--)
  136. {
  137. scanf("%d",&n);
  138. mem(first,-);mt=;
  139. for(i=;i<n;i++){
  140. scanf("%d%d%d",&a,&b,&c);
  141. adde(a,b,c,i);
  142. }
  143.  
  144. dfs1(,);
  145. ans=INF;
  146. dfs2(,,,);
  147.  
  148. printf("Case #%d: %d\n",ca++,ansid);
  149. }
  150. return ;
  151. }

HDU-4679 Terrorist’s destroy 树形DP,维护的更多相关文章

  1. hdu 4679 Terrorist’s destroy 树形DP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给定一颗树,每条边有一个权值w,问切掉哪条边之后,分成的两颗树的较大的直径*切掉边的权值最小? ...

  2. 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 ...

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

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

  4. HDU 4679 Terrorist’s destroy

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

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

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

  6. hdu 4514 并查集+树形dp

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

  7. HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)

    题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...

  8. HDU 4123 Bob’s Race 树形dp+单调队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...

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

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

随机推荐

  1. 让wordpress投稿作者在后台只看到自己的文章

    wordpress支持多作者撰写,让更多的人参与网站内容的创建是个不错的想法,UGC(User-generated content)使网站主题更丰富,不同的内容吸引不同的受众,一个好的网站应该多产生U ...

  2. 为你的PHP程序选择合适的密码库(初稿)

    如果本文中的术语让你感到疑惑,请先参阅密码学术语及概念一文. 密码学不是魔术.加密一个应用程序并不能保证它在袭击下的安全(特别是在你没有设置验证密文的情况下).但如果出于商业需求你要确保程序的安全,传 ...

  3. DJANGO输出HIGHCHARTS数据的样例

    XXX,DJANGO ORM里确实有很深的水,需要慢慢理解.. 比如: 获取指定时间段的数据: app.deployversion_set.filter(add_date__range=(date_s ...

  4. hdu 4454 Stealing a Cake 三分法

    很容易想到三分法求解,不过要分别在0-pi,pi-2pi进行三分. 另外也可以直接暴力枚举…… 代码如下: #include<iostream> #include<stdio.h&g ...

  5. JS 封装类

    function HighchartsObj(id, type) { var that = this; this.options = { chart : { renderTo : id, type : ...

  6. *[topcoder]GUMIAndSongsDiv1

    http://community.topcoder.com/stat?c=problem_statement&pm=12706&rd=15700 这题有意思.首先要观察到,如果选定一些 ...

  7. vimrc for windows

    set nobackupsource $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vimbehave mswin:color deser ...

  8. HASH暴力破解工具-Hashcat

    乌云网看到一篇文章讲述hashcat的使用简介(戳这里),对使用字典破解MD5内容 简单在kali上尝试了一下. (1)首先查看了下hashcat的帮助文档,简单截取了其中的部分常用说明. hashc ...

  9. WINCE6.0去掉桌面快捷方式

    WINCE6.0去掉桌面快捷方式,主要是修改xxx.bat文件,比如我要去掉My Documents和Media Player的快捷方式. (1)    去掉My Documents桌面快捷方式 找到 ...

  10. You must supply a layout_width attribute的错误原因及解决办法

    学习android的过程中,尝试新功能,结果出现了这个一个error: 05-21 15:38:52.745: E/AndroidRuntime(17608): java.lang.RuntimeEx ...