給定一棵無根樹,節點編號 1 到 n,邊長均為 1。要求計算任意兩點之間的距離之和(即每個點到其他所有點距離之和),時間複雜度必須為 O(n)。這是一道經典的樹形 DP / 換根 DP 題目,核心思想是利用「換根」技巧在線性時間內求出所有節點的答案。
sz[u] 和該節點到其子樹內所有節點的距離之和 dp[u]。同時可得根節點 1 的答案 ans[1] = dp[1]。u 的答案 ans[u],可在 O(1) 時間內推導出子節點 v 的答案 ans[v]。
推導公式:ans[v] = ans[u] + (n - 2 * sz[v])。
原理:從 u 移動到 v,v 的子樹內 sz[v] 個節點距離各減 1,其餘 n - sz[v] 個節點距離各加 1。總變化量 = (n - sz[v]) - sz[v] = n - 2*sz[v]。
掌握換根 DP 模板,即可輕松解決「樹上所有節點到其他節點距離之和」「樹的重心」「樹的直徑」等一系列經典問題。