1. 程式人生 > 實用技巧 >樹上最遠距離

樹上最遠距離

給定一顆N個節點的樹,結點從1到N編號。

現在要計算對於每個結點i,到它最遠的結點是多少距離,這個值記為S_iSi

輸入

第一行輸入兩個整數N(2 \le N \le 10^4)N(2N104)。

接下來N-1行,每行兩個整數x_i, y_i (1 \le x_i, y_i \le n, x_i \ne y_i)xi,yi(1xi,yin,xi=yi), 表示x_i, y_ixi,yi之間有一條邊。

輸入保證是一棵樹。

輸出

第i行輸出S_iSi

樣例

輸入

 1 /*************************************************************************
2 > Author: Henry Chen 3 > Mail: [email protected] 4 > Created Time: 鍥? 8/27 18:58:00 2020 5 ************************************************************************/ 6 7 #include<bits/stdc++.h> 8 using namespace std; 9 vector<pair<int,int> >vec[10001]; 10 int deep[5
][10001]; 11 void dfs(int u,int fa,int dep,int p) 12 { 13 // << u << endl; 14 deep[p][u] = dep; 15 for(int i = 0;i < vec[u].size();i++) 16 { 17 int v = vec[u][i].first; 18 if(v != fa) 19 { 20 dfs(v,u,dep+vec[u][i].second,p); 21 } 22
} 23 } 24 int main() 25 { 26 int n; 27 cin >> n; 28 for(int i = 2;i <= n;i++) 29 { 30 int u,v; 31 scanf("%d%d",&u,&v); 32 vec[i].push_back(make_pair(u,v)); 33 vec[u].push_back(make_pair(i,v)); 34 } 35 dfs(1,1,0,1); 36 int mx = 0; 37 int num; 38 for(int i = 1;i <= n;i++) 39 { 40 if(mx < deep[1][i]) 41 { 42 num = i; 43 mx = deep[1][i]; 44 } 45 } 46 dfs(num,num,0,2); 47 mx = 0; 48 for(int i = 1;i <= n;i++) 49 { 50 if(mx < deep[2][i]) 51 { 52 num = i; 53 mx = deep[2][i]; 54 } 55 } 56 dfs(num,num,0,3); 57 for(int i = 1;i <= n;i++) 58 { 59 printf("%d\n",max(deep[2][i],deep[3][i])); 60 } 61 return 0; 62 }

5
1 1
2 1
3 1
1 1

輸出

3
2
3
4
4

提示

結點4到結點1最遠,S_1 = 3S1=3

結點4和結點5到結點2都是最遠的,S_2 = 2S2=2

結點5到結點3距離最遠,S_3 = 3S3=3

結點5到結點4距離最遠,S_4 = 4S4=4

結點4到結點5距離最遠,S_5 = 4S5=4