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

题意:有n台电脑相连,让你求每台电脑与离它最远的那台电脑的距离。

思路:两遍搜索即可,第一遍从上到下,第二遍从小往上。对于某点,该点的最长半径为此点离自己孩子的最大距离和父亲节点传递下来的最长距离加连接此点的权值,两者之间选择最大值,但这里处理的时候要注意了,某点的孩子距离和父亲传递下来的最大距离可能为同一路径,因为父亲节点的最大距离可能经过此点。所以在处理的过程中不仅要随时记录最长路径,还要记录一个次长路径。这里WA了几次,更新最长路径的时候,记得要提前把最长路径传递给次长路径。

讲的很绕口。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <map>
  5. #include <vector>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. typedef long long lld;
  10. const lld maxn=;
  11. lld fmax[maxn], smax[maxn];
  12. int pre[maxn];
  13. map<int,map<int,int> >mp;
  14.  
  15. struct Node
  16. {
  17. int v, val;
  18. Node(){}
  19. Node(int v_, int val_)
  20. {
  21. v=v_, val=val_;
  22. }
  23. };
  24. vector<Node>vt[maxn];
  25.  
  26. void dfs(int u)
  27. {
  28. for(int i=; i<vt[u].size(); i++)
  29. {
  30. int v=vt[u][i].v, val=vt[u][i].val;
  31. dfs(v);
  32. if(fmax[v]+val>fmax[u]) smax[u]=fmax[u],fmax[u]=fmax[v]+val; ///这里要注意了,更新fmax的同时要把fmax传递给smax(最大传递给次大)
  33. else if(fmax[v]+val>smax[u]) smax[u]=fmax[v]+val;
  34. }
  35. }
  36.  
  37. void DFS(int u)
  38. {
  39. if(u==) ;
  40. else
  41. {
  42. int fa=pre[u], val=mp[fa][u];
  43. if(fmax[u]==fmax[fa]-val)
  44. {
  45. if(smax[fa]+val>fmax[u]) smax[u]=fmax[u], fmax[u]=smax[fa]+val;
  46. else if(smax[fa]+val>smax[u]) smax[u]=smax[fa]+val;
  47. }
  48. else
  49. {
  50. if(fmax[fa]+val>fmax[u]) smax[u]=fmax[u], fmax[u]=fmax[fa]+val;
  51. else if(fmax[fa]+val>smax[u]) smax[u]=fmax[fa]+val;
  52. }
  53. }
  54. for(int i=; i<vt[u].size(); i++)
  55. DFS(vt[u][i].v);
  56. }
  57.  
  58. int main()
  59. {
  60. int n;
  61. while(cin >> n)
  62. {
  63. mp.clear();
  64. for(int i=; i<=n; i++) fmax[i]=smax[i]=, pre[i]=, vt[i].clear();
  65. for(int i=; i<=n; i++)
  66. {
  67. int u, val;
  68. scanf("%d%d",&u,&val);
  69. vt[u].push_back(Node(i,val));
  70. mp[u][i]=val;
  71. pre[i]=u;
  72. }
  73. dfs();
  74. DFS();
  75. for(int i=; i<=n; i++)
  76. cout << fmax[i] <<endl;
  77. }
  78. return ;
  79. }
  80. /*
  81. 8
  82. 1 1
  83. 1 2
  84. 2 2
  85. 2 4
  86. 3 3
  87. 3 4
  88. 4 3
  89. */

【HDU2196 Computer】经典树形dp的更多相关文章

  1. HDU2196 Computer(树形DP)

    和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树 ...

  2. hdu2196 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[i][0/1/2]分别代表,从i点向下最大和次大深度,和向上最大深度. 然后转移就行了. 我的写法可能太丑了.死活调不出来,写了一个漂亮的 #incl ...

  4. HDU-2196 Computer (树形DP)

    题目大意:在一棵带边权的有根树中,对于每个点,找出它与离它最远的那个点的之间的距离. 题目分析:对于一个点,离它最远的点只有两种情况,一是它到叶子节点的最远距离,一是与它父亲的距离加上他的父亲到叶子节 ...

  5. SGU 149. Computer Network( 树形dp )

    题目大意:给N个点,求每个点的与其他点距离最大值 很经典的树形dp...很久前就想写来着...看了陈老师的code才会的...mx[x][0], mx[x][1]分别表示x点子树里最长的2个距离, d ...

  6. HDU 1561 The more, The Better 经典树形DP

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. HDU 2136:Computer(树形DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 Computer     Description A school bought the fi ...

  8. hdu 1054 Strategic Game 经典树形DP

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. hdu 2196(方法1:经典树形DP+方法2:树的直径)

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

随机推荐

  1. poj 2063 Investmen 完全背包

    这个题的想法不难,两个点: 1 是完全背包 2 是考虑/1000,降低复杂度   但是提交的时候反复的wa,最后找问题原来是dp开小了,可是dp本来开1005,后来开到100030过了.哎,如果没有时 ...

  2. 20145223《Java程序设计》实验报告3

    20145223 实验三<敏捷开发与XP实践> 实验内容 使用git上传代码 使用git相互更改代码 实验步骤: 一.使用git上传代码 $ git push 1.找到需要push的文件所 ...

  3. zjoi2016 day1【bzoj4455】【bzoj4456】

    首先做了T2的旅行者,看到bz上面过的人数比较多.. 考试的时候完全没有想太多.一闪而过了分块思想,然后就没有然后了.. 大视野上面有题解,竟然是一个初中生写的..? 正解其实是“分治”,每次选择中轴 ...

  4. BestCoder Round #71 (div.2)

    数学 1001 KK's Steel 类似斐波那契求和 #include <cstdio> #include <cstring> #include <algorithm& ...

  5. iOS 原生网络请求(推荐使用AFNetWorking库)

    .     同步GET请求       //第一步,创建URL       NSURL *url = [NSURL URLWithString:@"http://api.hudong.com ...

  6. mac 快捷键大全

    1.control+space 可以使用 spotlight搜索,用于快速找到所需要的文件 2.我尝试使用android studio 提示的快捷键来进行写代码,发现自己按照它的提示操作没有成功,原因 ...

  7. 04_Swift2基础之类型安全和类型推测+字面量+类型别名

    1. 类型安全和类型推测 1> 类型安全 Swift 是一个 _类型安全(type safe)_ 的语言.类型安全的语言可以让你清楚地知道代码要处理的值的类型.如果你的代码需要一个`String ...

  8. 洛谷 P1433 吃奶酪 Label:dfs && 剪枝Ex

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  9. JS:操作样式表1:行内样式

    //访问元素样式1, stye属性只对行内样式有用 var box = document.getElementById("box"); // alert(box.style.col ...

  10. 【BZOJ2456】mode 神奇的卡内存题

    以后把题解放在前面,估计没人看题解先看题... 内存1M,4个int(其实对内存的概念十分模糊),众数即为出现次数最多的数,可以用抵消的思想(但是众数不是可以是一大坨么...) #include &l ...