【HDU 2196】 Computer

题链http://acm.hdu.edu.cn/showproblem.php?pid=2196

刘汝佳《算法竞赛入门经典》P282页留下了这个问题:给出一棵树,求每个节点的最远点,每一个节点的最远点有两种可能,一种是向下拓展的最远点,一种是父节点的最远点,那么需要两次dfs即可。一次求出每个节点的最远点和次远点,一次直接计算。

  1. #include <queue>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <vector>
  9. #define ll long long
  10. #define inf 10000000000000
  11. #define mod 1000000007
  12. using namespace std;
  13. ll read()
  14. {
  15. ll x=0,f=1;
  16. char ch=getchar();
  17. while(ch<'0'||ch>'9')
  18. {
  19. if(ch=='-')f=-1;
  20. ch=getchar();
  21. }
  22. while(ch>='0'&&ch<='9')
  23. {
  24. x=x*10+ch-'0';
  25. ch=getchar();
  26. }
  27. return x*f;
  28. }
  29. const int N=1e4+10;
  30. const int M=1e4+10;
  31. struct Edge{
  32. int cost,to,nxt;
  33. }Path[M];
  34. int head[N],cnt;
  35. ll dis[N];
  36. void Addedge(int u,int v,int w){
  37. Path[cnt]=(Edge){w,v,head[u]};
  38. head[u]=cnt++;
  39. }
  40. void Init()
  41. {
  42. memset(head,0,sizeof(head));
  43. cnt=1;
  44. }
  45. //dp[i][0],dp[i][1]表示向下最大和次大距离,dp[i][2]表示向上最大距离
  46. int dp[N][3];
  47. void dfs1(int u)
  48. {
  49. int t1=0,t2=0; //最大和次大
  50. for(int i=head[u];i;i=Path[i].nxt){
  51. int v=Path[i].to;
  52. dfs1(v);
  53. int tmp=dp[v][0]+Path[i].cost;
  54. if(t1<=tmp){
  55. t2=t1;t1=tmp;
  56. }
  57. else if(t2<tmp) t2=tmp;
  58. }
  59. dp[u][0]=t1;dp[u][1]=t2;
  60. }
  61. void dfs2(int u)
  62. {
  63. for(int i=head[u];i;i=Path[i].nxt){
  64. int v=Path[i].to;
  65. dp[v][2]=max(dp[u][2],dp[v][0]+Path[i].cost==dp[u][0]?dp[u][1]:dp[u][0])+Path[i].cost;
  66. dfs2(v);
  67. }
  68. }
  69. int main()
  70. {
  71. int n;
  72. while(~scanf("%d",&n)){
  73. Init();
  74. for(int v=2;v<=n;v++){
  75. int u=read(),w=read();
  76. Addedge(u,v,w);
  77. }
  78. dfs1(1);dp[1][2]=0;dfs2(1);
  79. for(int i=1;i<=n;i++)
  80. printf("%d\n",max(dp[i][0],dp[i][2]));
  81. }
  82. return 0;
  83. }

【HDU 2196】 Computer (树形DP)的更多相关文章

  1. HDU 2196.Computer 树形dp 树的直径

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

  2. HDU 2196 Computer 树形DP经典题

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

  3. HDU 2196 Computer 树形DP 经典题

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

  4. hdu 2196 Computer(树形DP)

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

  5. hdu 2196 Computer 树形dp模板题

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

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

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

  7. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

  8. HDU - 2196(树形DP)

    题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...

  9. hdu 2196【树形dp】

    http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:找出树中每个节点到其它点的最远距离. 题解: 首先这是一棵树,对于节点v来说,它到达其它点的最远距离 ...

  10. HDU 2196 Compute --树形dp

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

随机推荐

  1. 由 var str = 'hello world' str.attr ='666'; 到包装类型

    近期有些小伙伴在公司的一道面试题踩了坑,  今天特地跟大家一起分享下: 原题如下: var str = 'hello world'; str.attr = '666'; console.log(str ...

  2. 标准块CP功能实现

    #include<stdio.h> int main(int argc,char *argv[]) { FILE *src_fp,*des_fp; int src_ret; ]={}; ) ...

  3. flask框架路由系统

    flask框架的url系统: flask框架的路由系统: flask框架的路由系统使用实例化的route方法来指定: 如: @app.route('/') route函数装饰器可以把一个函数绑定到对应 ...

  4. Qt事件系统之三:键盘事件

    QKeyEvent类用来描述一个键盘事件.当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件. QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可 ...

  5. 51nod 1126 求递推序列的第N项

    1126 求递推序列的第N项  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f( ...

  6. Join方法,yield方法,线程的优先级

  7. 017:COM1无法打开

    重新安装系统以后,COM1无法正常打开,重启以后也是如此.到设备管理器下,禁用COM1然后重启可以正常使用.修改COM1为别的COM号,重启以后可以正常使用.用Pcomm控件,打开该串口,错误号是-8 ...

  8. [转]C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等

    本文转自:http://www.cnblogs.com/suizhikuo/p/3791799.html 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Inte ...

  9. UWP Windows10开发更新磁贴和动态更新磁贴

    下面将介绍两种方式如何在windows10 uwp开发中如何更新应用磁贴: 实际上windows的磁贴就是用xml实现的,你只需要创建相应格式的xml就可以实现动态磁贴了 一,手动更新磁贴 二,轮询更 ...

  10. HTML标签,简单归纳

    列表标签 有序列表: <ol><li></li></ol> 无序列表: <ul><li></li></ul&g ...