树的直径
求解树的直径:
从树的任意一个节点开始BFS/DFS,找到距离最远的点P,之后从点P开始BFS/DFS,找到距离点P最远的点Q,PQ之间的距离就是该树的直径。
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 const int N = 1e5 + 10; 5 int h[N],w[N],e[N],ne[N],d[N],idx; 6 int n,m,p,ans; 7 void add(int a,int b,int c) 8 { 9 e[idx] = b; 10 w[idx] = c; 11 ne[idx] = h[a]; 12 h[a] = idx++; 13 } 14 15 void dfs(int u,int fa) 16 { 17 if(ans < d[u]) 18 { 19 ans = d[u]; 20 p = u; 21 } 22 for(int i = h[u];~i;i = ne[i]) 23 { 24 int j = e[i]; 25 if(j == fa) continue; 26 d[j] = d[u] + w[i]; 27 dfs(j,u); 28 } 29 } 30 31 void find(int x) 32 { 33 ans = 0; 34 d[x] = 0; 35 dfs(x,-1); 36 } 37 38 int main() 39 { 40 memset(h,-1,sizeof h); 41 cin >> n >> m; 42 for(int i = 0;i < m;++i) 43 { 44 int a,b,c; 45 cin >> a >> b >> c; 46 add(a,b,c); 47 add(b,a,c); 48 } 49 find(1); 50 find(p); 51 cout << ans << endl; 52 return 0; 53 }

浙公网安备 33010602011771号