樹中距離之和(樹形dp)

2021-10-10 01:27:20 字數 671 閱讀 2256

題意:給定乙個含有n個節點的樹,求各個點到其他點的距離之和。返回乙個vector。

舉例:假設返回vectotans。則ans[0] = dist(0,1) + dist(0,2) + ...+ dist(0,n)

思路:考慮一種簡化的情況:求各個點到根節點的距離之和。

該簡化情況可通過樹狀dp來解決。

設陣列dp,dp[u]為以點u為根節點的子樹的子節點到點u的距離之和;陣列nodes,nodes[u]為以點u為根節點的節點數。

則更新公式為:

所以,在以root為根節點的樹中,其他點到根節點root的距離之和為dp[root]。

在該題目中,需要求的是各個點到其他點的距離之和。所以在求得其他點到根節點的距離之和後,需要對樹進行變化,具體來說便是將根節點下移,子節點上移作為根節點。

假設u為根節點,v為子節點,則有:

**:

class solution 

}void dfs2(int u, int fa)

}vectorsumofdistancesintree(int n, vector>& edges) );

for(auto& edge : edges)

dfs(0, -1);

dfs2(0, -1);

return ans;}};

834 樹中距離之和

給定乙個無向 連通的樹。樹中有 n 個標記為 0.n 1 的節點以及 n 1 條邊 第 i 條邊連線節點 edges i 0 和 edges i 1 返回乙個表示節點 i 與其他所有節點距離之和的列表 ans。示例 1 輸入 n 6,edges 0,1 0,2 2,3 2,4 2,5 輸出 8,12...

leetcode 834樹中距離之和

這道題考察的是樹形dp,需要兩次dfs。第一次dfs建立樹形結構,並求得根節點到其他點的距離和。第二次dfs是通過交換根節點,獲得以其他點作為根節點的距離和。對於根節點u和它的子結點v,u與其他節點的距離和dp u 可以表示為 d p v sz v sigma dp v sz v dp v sz v...

LeetCode 834 樹中距離之和

原題目 思路 採用樹形動態規劃的思想。對於每乙個節點來說,所有節點到他的距離之和的狀態轉移方程為 其中dp v 代表以v為根的所有節點到他的距離,sz v 表示已v為根的子樹節點的數量。dp u dp u dp v sz v sz u sz u sz v dp v dp v dp u sz u sz...