描述
給定一顆包含n個節點的無根樹,並且把節點從1-n編號。
現在讓你求對於每個點,求出所有點到這個點的距離的和(距離當然是最短距離了..)。
輸入 第一行包含乙個正整數n ( n <= 100000 ),表示節點的個數。
後面(n - 1)行,每行兩個整數(u, v)表示樹的邊u-v。
輸出 每行乙個整數,第i(i = 1,2,…n)行表示所有節點到第i個點的距離之和。(i到i節點的距離為0)
樣例輸入1 複製
4 1 2
3 2
4 2
樣例輸出1
5 3
5 5
分析:
以1號節點為根建樹。
第一遍深搜,記錄乙個點子節點到達這個節點的距離之和子節點的個數。在回溯的時候,當前節點的所有子節點和它的距離之和就是他直接子節點和值(其子節點距離之和)加上其子節點的數目。這樣深搜完之後就可以得出根節點的結果。
第二遍深搜就是用根節點的答案推出子節點的答案。如果知道了父節點的答案,那麼子節點的答案就是父節點的答案減去其對父節點的貢獻,其實就是得出了除去以當前節點為根節點的子樹之後父節點的答案,再用這個值加上除去這個子樹的節點數。就是當前節點的答案了。
可以畫畫圖,就顯而易見了。
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
struct node p[200000];
vector
a[200000];
int vis[200000];
int n, m;
void dfs(int k)
}}void dfs1(int k, int fa)
for(int i = 0; i < a[k].size(); i++)
}}int main()
dfs(1);
memset(vis, 0, sizeof(vis));
p[1].ans = p[1].up;
dfs1(1, -1);
for(int i = 1; i <= n; i++)
return
0;}
qduoj 80 樹結構重逢 樹形DP
題意 給定一顆包含n個節點的無根樹,並且把節點從1 n編號。現在讓你求對於每個點,求出所有點到這個點的距離的和 距離當然是最短距離了.思路 跟hdu3899一毛一樣的思路,注意sum要開long long。include include include includeusing namespace ...
QDU 80 樹結構重逢 樹形dp 模板
給定一顆包含n個節點的無根樹,並且把節點從1 n編號。現在讓你求對於每個點,求出所有點到這個點的距離的和 距離當然是最短距離了 第一行包含乙個正整數n n 100000 表示節點的個數。後面 n 1 行,每行兩個整數 u,v 表示樹的邊u v。每行乙個整數,第i i 1,2,n 行表示所有節點到第i...
繪製樹結構
樹的表示方法有雙親表示法 孩子表示法 雙親孩子表示法 孩子兄弟表示法,具體請參考其中前三種基於陣列,最後一種基於鍊錶。我定義的數節點資料結構為 typedef struct treenode treenode,ptreenode 也就是孩子兄弟表示法,附加乙個指向父節點的指標。參考上圖,發現第乙個子...