|
51 | 51 |
|
52 | 52 | 对于节点 $u,ドル定义 $dp[u]$ 为:以节点 $u$ 为根节点的树,它的所有子节点到它的距离之和。
|
53 | 53 |
|
54 | | -然后进行一轮深度优先搜索,在搜索的过程中得到以节点 $v$ 为根节点的树,节点 $v$ 与所有其他子节点之间的距离之和 $dp[v]$。还能得到以节点 $v$ 为子树的子节点个数 $sizes[v]$。 |
| 54 | +然后进行一轮深度优先搜索,在搜索的过程中得到以节点 $v$ 为根节点的树,节点 $v$ 与所有其他子节点之间的距离之和 $dp[v]$。还能得到子树的节点个数 $sizes[v]$。 |
55 | 55 |
|
56 | 56 | 对于节点 $v$ 来说,其对 $dp[u]$ 的贡献为:节点 $v$ 与所有其他子节点之间的距离之和,再加上需要经过 $u \rightarrow v$ 这条边的节点个数,即 $dp[v] + sizes[v]$。
|
57 | 57 |
|
|
61 | 61 |
|
62 | 62 | 我们可以使用「二次遍历换根法」进行优化,从而在 $O(n)$ 的时间复杂度内解决这道题。
|
63 | 63 |
|
64 | | -第一次遍历: |
| 64 | +以编号为 0ドル$ 的节点为根节点,进行两次深度优先搜索。 |
| 65 | + |
| 66 | +1. 第一次遍历:从编号为 0ドル$ 的根节点开始,自底向上地计算出节点 0ドル$ 到其他的距离之和,记录在 $ans[0]$ 中。并且统计出以子节点为根节点的子树节点个数 $sizes[v]$。 |
| 67 | +2. 第二次遍历:从编号为 0ドル$ 的根节点开始,自顶向下地枚举每个点,计算出将每个点作为新的根节点时,其他节点到根节点的距离之和。如果当前节点为 $v,ドル其父节点为 $u,ドル则自顶向下计算出 $ans[u]$ 之后,我们将根节点从 $u$ 换为节点 $v,ドル子树上的点到新根节点的距离比原来都小了 1ドル,ドル非子树上剩下所有点到新根节点的距离比原来都大了 1ドル$。则可以据此计算出节点 $v$ 与其他节点的距离和为:$ans[v] = ans[u] + n - 2 \times sizes[u]$。 |
65 | 68 |
|
66 | 69 | ### 思路 1:代码
|
67 | 70 |
|
|
0 commit comments