一个比较经典的题型,两次DFS求树上每个点的最远端距离。

参考这里:http://hi.baidu.com/oi_pkqs90/item/914e951c41e7d0ccbf904252

dp[i][0]表示最远端在以 i 为根的子树中的最长长度,dp[i][1]记录最远端在以i为根的子树中的次长长度,dp[i][2]表示最远端不在以 i 为根的子树中的最长长度。

答案即为max( dp[i][0], dp[i][2] );

dp[i][0]和dp[i][1]可以通过一次DFS得到。

再看dp[i][2], 设fa[i]为节点 i 的父节点:  dp[i][2] = max( dp[ fa[i] ][2], dp[ fa[i] ][0] ) + dis[ fa[i] ][i];

显然,如果dp[ fa[i] ][0] 中的最长长度是由dp[i][0]状态转移得到的,上面的结论就不对了。

于是我们还需要记录dp[i][1]: 最远端在以i为根的子树中的次长长度。

假设best[i]表示:状态dp[i][0]是由状态dp[ best[i] ][0]转移得到,则:

if ( best[i] == fa[i] ) dp[i][2] = max( dp[ fa[i] ][2], dp[ fa[i] ][1] ) + dis[ fa[i] ][i];

else dp[i][2] = max( dp[ fa[i] ][2], dp[ fa[i] ][0] ) + dis[ fa[i] ][i];

因此还需要一次DFS求得dp[i][2], 答案即为max( dp[i][0], dp[i][2] );

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int MAXN = ;
  9.  
  10. struct node
  11. {
  12. int v;
  13. int w;
  14. int next;
  15. };
  16.  
  17. int N, EdgeN;
  18. int head[MAXN];
  19. int best[MAXN];
  20. int dp[MAXN][];
  21. node D[ MAXN << ];
  22.  
  23. void AddEdge( int u, int v, int w )
  24. {
  25. D[EdgeN].v = v;
  26. D[EdgeN].w = w;
  27. D[EdgeN].next = head[u];
  28. head[u] = EdgeN++;
  29. return;
  30. }
  31.  
  32. void DFS1( int u )
  33. {
  34. for ( int i = head[u]; i != -; i = D[i].next )
  35. {
  36. int v = D[i].v;
  37. int w = D[i].w;
  38. DFS1(v);
  39. if ( dp[v][] + w > dp[u][] )
  40. {
  41. dp[u][] = dp[u][];
  42. dp[u][] = dp[v][] + w;
  43. best[u] = v;
  44. }
  45. else if ( dp[v][] + w > dp[u][] )
  46. dp[u][] = dp[v][] + w;
  47. }
  48. return;
  49. }
  50.  
  51. void DFS2( int u )
  52. {
  53. for ( int i = head[u]; i != -; i = D[i].next )
  54. {
  55. int fa = D[i].v;
  56. int w = D[i].w;
  57. dp[fa][] = dp[u][] + w;
  58. if ( fa == best[u] )
  59. dp[fa][] = max( dp[fa][], dp[u][] + w );
  60. else dp[fa][] = max( dp[fa][], dp[u][] + w );
  61. DFS2( fa );
  62. }
  63. return;
  64. }
  65.  
  66. int main()
  67. {
  68. while ( scanf( "%d", &N ) == )
  69. {
  70. EdgeN = ;
  71. memset( head, -, sizeof(head) );
  72. for ( int v = ; v <= N; ++v )
  73. {
  74. int u, w;
  75. scanf( "%d%d", &u, &w );
  76. AddEdge( u, v, w );
  77. AddEdge( v, u, w );
  78. }
  79.  
  80. memset( dp, , sizeof(dp) );
  81. DFS1();
  82. DFS2();
  83.  
  84. for ( int i = ; i <= N; ++i )
  85. printf( "%d\n", max( dp[i][], dp[i][] ) );
  86. }
  87. return ;
  88. }

SGU 149 Computer Network 树DP/求每个节点最远端长度的更多相关文章

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

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

  2. SGU 149. Computer Network

    时间限制:0.25s 空间限制:4M: 题意: 给出一颗n(n<=10000)个节点的树,和n-1条边的长度.求出这棵树每个节点到最远节点的距离: Solution: 对于一个节点,我们可以用D ...

  3. POJ 3659 Cell Phone Network (树dp)

    题目链接:http://poj.org/problem?id=3659 给你一个树形图,一个点可以覆盖他周围连接的点,让你用最少的点覆盖所有的点. dp[i][0]表示用i点来覆盖,dp[i][1]表 ...

  4. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  5. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

  6. [J]computer network tarjan边双联通分量+树的直径

    https://odzkskevi.qnssl.com/b660f16d70db1969261cd8b11235ec99?v=1537580031 [2012-2013 ACM Central Reg ...

  7. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  8. [HDOJ2196]Computer (树直径, 树DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 给一棵树,求树上各点到某点的距离中最长的距离.注意每个点都要求. 和普通求树的直径不一样,要求每 ...

  9. (中等) CF 555E Case of Computer Network,双连通+树。

    Andrewid the Android is a galaxy-known detective. Now he is preparing a defense against a possible a ...

随机推荐

  1. Oracle Goldengate和Oracle Data Integrator的初步认识

    免责声明:     本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除 1. Oracle Glodengate是什么? GoldenGate是oracle的一种基于数据库日志的数据同步软件 ...

  2. 【Python】可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,flo ...

  3. IDEA for Mac 解决控制台乱码问题

    近期发现 idea for mac 版本中 tomcat 控制台有中文的地方出现乱码问题,其实很简单就可以解决. 这里做个笔记,以后可以方便不会的人来解决 ---------------------- ...

  4. 来自平时工作中的javascript知识的积累---持续补充中

    ① SeaJs和RequireJS最大的区别 解惑:来自豆友 ② javascript中如何判断undefined var exp = undefined; if (exp === undefined ...

  5. 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps

    四大机器学习降维算法:PCA.LDA.LLE.Laplacian Eigenmaps 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映 ...

  6. flex Chrome flash调试时 出现Shockwave flash has crashed的解决办法

    在Chrome中输入:chrome://plugins/     PPAPI的Flash Player停用. 使用NPAPI的Flash player. 这里好像没有显示是Debug版本. 但是我在调 ...

  7. 可执行文件(ELF)格式之讲解

    ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自 ...

  8. HDU4776 Ants(Trie && xor)

    之前mark下来的一道题,今天填一下坑. 题意是这样子的.给你一棵边上有权的树.然后有树上两点(u,v)的路径有n*(n-1)条,路径(u,v)的权值是边权的xor. 然后下面有m个询问,询问你n*( ...

  9. iOS搜索栏

    百度云连接:http://pan.baidu.com/s/1pJLzDFX

  10. Server Library [Apache Tomcat v6.0](unbound)服务未绑定解决办法

    (1) 单击File按钮---钩选Show AllWizard——>选择Server——>单击Next (2)Add Library    选择 WTP Server Runtime(My ...