题目描述

题解
树形DP
先考虑本题的一个简化情况, 求出一棵树中每个节点到其所有子节点的距离之和.
对于以u为根的子树, 它到树中所有节点的距离之和用dp[u]表示. 状态转移方程为:
$$
dp[u] = \sum_{v\in son[u]} dp[v] + sz[v]
$$
其中$son[u]$表示u节点的所有儿子节点. 采用自底向上的思路, 所以要用后续DFS, 经过一遍DFS后dp数组就保留了每个节点到以它为根的子树中所有节点的距离和.
在此基础上来分析本题的思路.
在计算每个节点到其他所有节点的距离和时, 要将该节点作为整棵树的根节点, 然后就可以利用上述的dp数组. 所以问题是如何将该节点变成根节点. 首先将节点v从u中剥离
$$
dp[u] = dp[u] - \left(dp[v] + sz[v]\right)
$$
然后将u加到v上面
$$
dp[v] = dp[v] + \left(dp[u] + sz[u]\right)
$$
1 | public class lc834 { |