- 以c为根的子树,其中的所有节点和c的距离比和0的距离少1
- 除此之外,所有其他的节点和c的距离比和0的距离多1
- 如果以c为根的子树size为s,那么c和其他节点的距离和dp[c] = dp[0] - s + N - s,N为总节点数
- 求每个子树size的话,也是树形dp的思路,对于当前节点root和其其节点c1, c2...,size[root] = 1 + sum(size[ci])
我们dfs两次,第一次求出所有子树的size和其他节点到0的距离。第二次求每个节点到其余节点的距离和。另外可以注意到的一点,如果带权的话方法是一样的,我们知道当前节点到每个子节点的边的长度,对递推方程稍加修改即可,例题可以参考Fermat Point in Graph。对时间复杂度O(N),空间复杂度O(N):
No comments:
Post a Comment