树的直径

求解树的直径:

  从树的任意一个节点开始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 }

 

posted @ 2022-04-20 10:49  Modest-Hamilton  阅读(41)  评论(0)    收藏  举报