原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2196
题意:求一棵树中距离每一个节点的最大路径权值和。
思路:假如固定了起点,那么我们通过一遍 d f s dfs dfs就可以得到距离根节点中最远的点的路径权值和,但是这题需要输出 n n n个点的答案,显然对每一个点的跑一遍 d f s dfs dfs是不可行的。所以需要进行优化。
可以使用一种换根的技巧,在预处理之后可以在 O ( n ) O(n) O(n)的时间内求出每一个节点的答案。
对于上图中的 v v v节点来说,如果要把根从 u u u节点移动到 v v v节点,答案的贡献来自于 3 3 3个部分,也就是图中的绿色区域。一个是 v v v的子节点中可以贡献一个 a n s 1 ans1 ans1,一个是以u为根的子树-以v为根的子树的其余节点可以贡献一个 a n s 2 ans2 ans2,一个是以 u u u的父亲节点的子树减去以 u u u为根的子树可以贡献一部分答案。
总体答案就是这 3 3 3部分取个 m a x max max。
所以写代码的时候维护一个 d p [ m a x n ] [ 3 ] dp[maxn][3] dp[max