Computer

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 31049    Accepted Submission(s): 3929

Problem Description
A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Managers of school are anxious about slow functioning of the net and want to know the maximum distance Si for which i-th computer needs to send signal (i.e. length of cable to the most distant computer). You need to provide this information. 

Hint: the example input is corresponding to this graph. And from the graph, you can see that the computer 4 is farthest one from 1, so S1 = 3. Computer 4 and 5 are the farthest ones from 2, so S2 = 2. Computer 5 is the farthest one from 3, so S3 = 3. we also get S4 = 4, S5 = 4.

 
Input
Input file contains multiple test cases.In each case there is natural number N (N<=10000) in the first line, followed by (N-1) lines with descriptions of computers. i-th line contains two natural numbers - number of computer, to which i-th computer is connected and length of cable used for connection. Total length of cable does not exceed 10^9. Numbers in lines of input are separated by a space.
 
Output
For each case output N lines. i-th line must contain number Si for i-th computer (1<=i<=N).
 
Sample Input
5
1 1
2 1
3 1
1 1
 
Sample Output
3
2
3
4
4
 
Author
scnu
 
题意:求一棵树上任一点到其他点的最远距离。
思路:1)树上的任意一点到其他点的最远距离必然是到达树的直径的两个端点之一,树的直径只需要2遍dfs即可。
2)重点说一下树形dp的思路。dp[i][0],dp[i][1],dp[i][2]分别表示:i通过子树可以达到的最远距离;i通过子树可以到达的次远距离(不同儿子);i通过父亲能够到达的最远距离。那么ans[i]=max(dp[i][0],dp[i][2]);
对于<u,v>w:
状态转移方程:dp[u][0]=dp[v][0]+w;dp[u][1]也是这样得到,但是注意dp[i][1]是通过另外的儿子获得。
1.dp[v][2]=dp[u][1]+w; 2.dp[v][2]=dp[u][0]+w;当<u,v> 是u的最长子树的路径时,只能用1式子。
代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<stack>
  8. #include<map>
  9. #include<stack>
  10. #include<set>
  11. #include<bitset>
  12. using namespace std;
  13. #define PI acos(-1.0)
  14. #define eps 1e-8
  15. typedef long long ll;
  16. typedef pair<int,int > P;
  17. const int N=1e5+,M=1e5+;
  18. const int inf=0x3f3f3f3f;
  19. const ll INF=1e18+,mod=1e9+;
  20. struct edge
  21. {
  22. int from,to;
  23. ll w;
  24. int next;
  25. };
  26. edge es[M];
  27. int cnt,head[N];
  28. ll dp[N][];
  29. void init()
  30. {
  31. cnt=;
  32. memset(head,-,sizeof(head));
  33. }
  34. void addedge(int u,int v,ll w)
  35. {
  36. cnt++;
  37. es[cnt].from=u,es[cnt].to=v;
  38. es[cnt].w=w;
  39. es[cnt].next=head[u];
  40. head[u]=cnt;
  41. }
  42. void dfs1(int u,int fa)
  43. {
  44. for(int i=head[u]; i!=-; i=es[i].next)
  45. {
  46. edge e=es[i];
  47. if(e.to==fa) continue;
  48. dfs1(e.to,u);
  49. ll d=dp[e.to][]+e.w;
  50. if(d>dp[u][]) swap(d,dp[u][]);
  51. if(d>dp[u][]) swap(d,dp[u][]);
  52. }
  53. }
  54. void dfs2(int u,int fa)
  55. {
  56. for(int i=head[u]; i!=-; i=es[i].next)
  57. {
  58. edge e=es[i];
  59. if(e.to==fa) continue;
  60. if(dp[u][]==dp[e.to][]+e.w)
  61. dp[e.to][]=max(dp[u][],dp[u][])+e.w;
  62. else
  63. dp[e.to][]=max(dp[u][],dp[u][])+e.w;
  64. dfs2(e.to,u);
  65. }
  66. }
  67. int main()
  68. {
  69. int n;
  70. while(~scanf("%d",&n))
  71. {
  72. init();
  73. for(int i=,j; i<=n; i++)
  74. {
  75. ll w;
  76. scanf("%d%lld",&j,&w);
  77. addedge(i,j,w);
  78. addedge(j,i,w);
  79. }
  80. memset(dp,,sizeof(dp));
  81. dfs1(,);
  82. dfs2(,);
  83. for(int i=; i<=n; i++)
  84. printf("%d\n",max(dp[i][],dp[i][]));
  85. }
  86. return ;
  87. }

树形dp

HDU 2196.Computer 树形dp 树的直径的更多相关文章

  1. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  2. computer(树形dp || 树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  4. hdu-2169 Computer(树形dp+树的直径)

    题目链接: Computer Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 2196 Computer(树形DP)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  6. hdu 2196 Computer 树形dp模板题

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  7. hdu 2196 Computer(树形DP经典)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. Computer(HDU2196+树形dp+树的直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每 ...

  9. hdu 4607 树形dp 树的直径

    题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...

随机推荐

  1. charles抓不到APP内的某些接口-解决部分汇总

    首先,让我哭会,我竟然自己解决了问题.网上查的解决办法都试过了就是不管用,也问过前辈,就是没招. 果然,自立自强,勇者不息. Top1 问题:charles抓不到接口? 现象:web端的网络请求OK, ...

  2. leetCode53. 最大子序和

    示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 进阶: /** * @param {number[]} nu ...

  3. html弹出div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 云栖大会day1 下午

    下午参与的是创新创业专场 会议议程是 创新创业专场-2018阿里云创新中心年度盛典 13:30-14:10 阿里双创新征程 李中雨 阿里云创业孵化事业部总经理 14:10-14:40 人货场的渗透与重 ...

  5. inpu控件接受pipe的处理结果

    input控件绑定的变量,要接受用户的输入值,一般只要使用   [(ngModel)]  就可以. 但是,pipe处理结果如何反映到变量里去呢?不知道吧?嘿嘿 这样就可以了 :  <input ...

  6. celery (二) task

    Task task 具有如下特点: task 可以在任何可调用的地方创建.它有双重角色: 定义了当task被调用时,会发送一个消息. 定义了当worker收到消息时会运行消息对应的函数 每个task都 ...

  7. 给C#Control组件统一增加加属性

    http://www.cnblogs.com/SharkXu/archive/2006/08/24/EnterGoto.html

  8. layui xtree 实现一级节点单选 ,子节点复选

    在外部定义变量和方法 //定义变量 接收顶级节点的值 var topValue; // 获取顶级节点值的方法 function getParent(value) { var val = project ...

  9. maven的pom.xml文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  10. mybatis入门知识

    概述 MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动.创建 Connection.配置 Sta ...