题目描述
题解
树形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 { |