世界真的很大
树上最长的路径==树的直径
树的直径的求法应该都知道了,那对于树上的每个点,求出从他出发最远的路径
这个当然可以每一个点DFS一遍得到,但是不如这个O(n)复杂度的算法来的优秀
看题先:
description:
给出一棵树,求出对于每个点,他到树上理他最远的点的距离
input:
多组数据,到EOF
每组数据第一行一个整数n表示节点数
接下来n-1行每行两个整数v,w表示i+1号点到v有一条边权为w的边
output:
n行,每行一个整数表示答案
树上问题一个很重要的东西就是可以限制上和下的方向
即指定根节点无根树转有根树
那么对于一个点,树上到他的最长距离要么是在他的子树内,要么就是在子树外
记录down为子树内的最大距离,up为子树外的最大距离
down可以通过一次DFS直接求到
考虑up的求法
一个点的子树外最大距离,要么是其父亲的最大距离+边权,要么就是其兄弟的down最大距离+边权
而且就算是兄弟的由于我们要求的是最大值,所以完全可以使用父亲的down数组
但是问题来了,如果父亲的down正好在u的子树内,就不能用这个来更新up了
所以我们除了往下的最大值down以外,还