题意:

There is a city which is built like a tree.A terrorist wants to destroy the city's roads. But now he is alone, he can only destroy one road, then the city will be divided into two cities. Impression
of the city is a number defined as the distance between the farthest two houses (As it relates to the fare).When the terrorist destroyed a road, he needs to spend some energy, assuming that the number is a.At the same time,he will get a number b which is maximum
of the Impression of two cities. The terrorist wants to know which road to destroy so that the product of a and b will be minimized.You should find the road's id.

Note that the length of each road is one.
给出一个树形图,和边权值w代表耗费的能量,每条边的长度是1;破坏一条边<u,v>会形成两棵树,b是两个树中较大的那个直径,a是<u,v>的能量值,求破坏哪条边保证a*b的至最小若存在多个,则输出最先出现的那条边;
分析:求树的直径,我们很容易想到两个dfs可以求出树的直径,所以先树形dp(前两个dfs)求出每个点的正向距离的最大值dis[u][0]和次大值dis[u][1],以及反向距离最大值dis[u][2],然后第三个dfs深搜枚举每条边的两个点<u,v>,对于v点,v所对应的子树的直径就是

dis[v][0]+dis[v][1];

对于v如果belong[u]==v这u所对应的子树的直径是dis[u][1]+dis[u][2];否则对应的子树直径是dis[u][0]+dis[u][2];

然后枚举a*b即可:
  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include"stdio.h"
  3. #include"string.h"
  4. #include"stdlib.h"
  5. #include"queue"
  6. #include"algorithm"
  7. #include"string.h"
  8. #include"string"
  9. #include"math.h"
  10. #include"vector"
  11. #include"stack"
  12. #include"map"
  13. #define eps 1e-4
  14. #define inf 0x3f3f3f3f
  15. #define M 100009
  16. #define PI acos(-1.0)
  17. using namespace std;
  18. struct node
  19. {
  20. int u,v,w,next;
  21. }edge[M*2];
  22. int t,head[M],dis[M][4],length[M*2],belong[M];
  23. __int64 ans,num[M],n;
  24. void init()
  25. {
  26. t=0;
  27. memset(head,-1,sizeof(head));
  28. }
  29. void add(int u,int v,int w)
  30. {
  31. edge[t].u=u;
  32. edge[t].v=v;
  33. edge[t].w=w;
  34. edge[t].next=head[u];
  35. head[u]=t++;
  36. }
  37. void dfs(int u,int f)
  38. {
  39. dis[u][0]=dis[u][1]=dis[u][2]=0;
  40. for(int i=head[u];~i;i=edge[i].next)
  41. {
  42. int v=edge[i].v;
  43. if(v==f)continue;
  44. dfs(v,u);
  45. if(dis[u][0]<dis[v][0]+1)
  46. {
  47. dis[u][1]=dis[u][0];
  48. dis[u][0]=dis[v][0]+1;
  49. belong[u]=v;
  50. }
  51. else if(dis[u][1]<dis[v][0]+1)
  52. dis[u][1]=dis[v][0]+1;
  53. }
  54. }
  55. void dfs1(int u,int f)
  56. {
  57. for(int i=head[u];i!=-1;i=edge[i].next)
  58. {
  59. int v=edge[i].v;
  60. if(v==f)
  61. continue;
  62. if(belong[u]==v)
  63. dis[v][2]=max(dis[u][1],dis[u][2])+1;
  64. else
  65. dis[v][2]=max(dis[u][0],dis[u][2])+1;
  66. dfs1(v,u);
  67. }
  68. }
  69. void dfs2(int u,int f)
  70. {
  71. for(int i=head[u];~i;i=edge[i].next)
  72. {
  73. int v=edge[i].v;
  74. if(v==f)continue;
  75. if(belong[u]==v)
  76. {
  77. length[i]=dis[v][0]+dis[v][1];
  78. length[i^1]=dis[u][1]+dis[u][2];
  79. }
  80. else
  81. {
  82. length[i]=dis[v][0]+dis[v][1];
  83. length[i^1]=dis[u][0]+dis[u][2];
  84. }
  85. dfs2(v,u);
  86. }
  87. }
  88. int main()
  89. {
  90. int Case,i,n,a,b,c,kk=1;
  91. scanf("%d",&Case);
  92. while(Case--)
  93. {
  94. scanf("%d",&n);
  95. init();
  96. for(i=1;i<n;i++)
  97. {
  98. scanf("%d%d%d",&a,&b,&c);
  99. add(a,b,c);
  100. add(b,a,c);
  101. }
  102. dfs(1,-1);
  103. dfs1(1,-1);
  104. dfs2(1,-1);
  105. ans=inf;
  106. int id;
  107. for(i=0;i<t;i+=2)
  108. {
  109. //printf("%d %d %d %d\n",edge[i].u,edge[i].v,length[i],length[i^1]);
  110. int m=max(length[i],length[i^1])*edge[i].w;
  111. if(ans>m)
  112. {
  113. id=i;
  114. ans=m;
  115. }
  116. }
  117. printf("Case #%d: %d\n",kk++,(id+2)/2);
  118. }
  119. }


树形DP 2013多校8(Terrorist’s destroy HDU4679)的更多相关文章

  1. hdu4705 Y 简单树形DP 2013多校训练第十场 J题

    题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...

  2. hdu4681 String DP(2013多校第8场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 思路: 我是胡搞过的 就是先预处理出(i,j)的正向的最大连续子串和逆向最大连续子串 然后对于A ...

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

  4. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  5. HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)

    /** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...

  6. HDU 4681 String(2013多校8 1006题 DP)

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

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

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

  8. HDU-6035 Colorful Tree(树形DP) 2017多校第一场

    题意:给出一棵树,树上的每个节点都有一个颜色,定义一种值为两点之间路径中不同颜色的个数,然后一棵树有n*(n-1)/2条 路径,求所有的路径的值加起来是多少. 思路:比赛的时候感觉是树形DP,但是脑袋 ...

  9. hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】

    题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...

随机推荐

  1. 挑战编程PC/UVa Stern-Brocot代数系统

    /* Stern-Brocot代数系统 Stern-Brocot树是一种生成所有非负的最简分数m/n的美妙方式. 其基本方式是从(0/1, 1/0)这两个分数开始, 根据需要反复执行如下操作: 在相邻 ...

  2. 【转】 使用Redis的Pub/Sub来实现类似于JMS的消息持久化

    http://blog.csdn.net/canot/article/details/52040415 关于个人对Redis提供的Pub/Sub机制的认识在上一篇博客中涉及到了,也提到了关于如何避免R ...

  3. C# DateTime类型和时间戳 互相转换

    /// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <param name=”timeStamp”></para ...

  4. WPF绑定Model的实例对象

    创建一个用户控件 1. behindcode指定this.DataContext=XXViewModel 2. "{Binding DataContext.EditModel.MId,Rel ...

  5. VB的try语句,异常处理

    Try语句格式 Try 程式语句 Catch Throw ex Finally 释放一些连接等动作,不管有没有抛异常,都会执行到这里 End try 捕捉异常的语句是很好用的,在程式发生错误时,可以利 ...

  6. php---文件上传分析

    文件上传: 先抄一段:预定义变量$_FILES数组有5个内容:       $_FILES['userfile']['name']——客户端机器文件的原名称       $_FILES['userfi ...

  7. js严格模式“use strict”

    js的严格模式会放弃js中的一些不正规的写法,参考 http://www.cnblogs.com/God-Shell/p/3139329.html: 使用声明"use  strict&quo ...

  8. 多大开始玩EV3

    机器人EV3还是初中生才能玩的溜 耐撕爸爸推荐年龄:初中及以上 推荐理由:无需使用计算机就可进行编程,培养孩子的编程.机械.电子.物理等综合能力. 在欧美等国家,乐高机器人融入教学已成为一种普遍现象, ...

  9. 如何在APICloud平台使用腾讯X5引擎

    目前APICloud与腾讯X5引擎已经达成全方位的深度合作,APICloud在多个产品线深度集成X5引擎,广大APICloud开发者们即日起可通过以下几方面在你的APP中使用X5引擎,享受X5引擎带来 ...

  10. 在美国看中国HTML5市场的发展

    近日,APICloud 创始人兼CEO刘鑫在美国旧金山和美国的HTML5开发者进行了一次近距离的接触,感受中美HTML5开发者的热度差别和不同市场阶段的中美表现巨大差异. 中国和美国的HTML5市场差 ...