1.树的直径

树上最长的简单路径即为树的直径。

求树的直径的方法就是在树上任选一点u,求距离点u最远的点y,再求距离点y最远的点s,点y到点s的距离即为树的直径。

 1 #include<cstdio>
 2 #include<cstring>
 3 #define N 4200
 4 struct hehe{
 5     int next;
 6     int to;
 7 }edge[N];
 8 int num_edge,head[N],dis[N],n,a,b,y;
 9 int add_edge(int from,int to){
10     edge[++num_edge].next=head[from];
11     edge[num_edge].to=to;
12     head[from]=num_edge;
13 }
14 int dfs(int x){
15     for(int i=head[x];i;i=edge[i].next)
16         if(!dis[edge[i].to]){
17             dis[edge[i].to]=dis[x]+1;
18             dfs(edge[i].to);
19         }
20 }
21 int main(){
22     scanf("%d",&n);
23     for(int i=1;i<n;++i){
24         scanf("%d%d",&a,&b);
25         add_edge(a,b);
26         add_edge(b,a);
27     }
28     dfs(1);
29     for(int i=y=1;i<=n;i++)
30         if(dis[i]>dis[y])
31             y=i;
32     memset(dis,0,sizeof(dis));
33     dfs(y);
34     for(int i=y=1;i<=n;i++)
35         if(dis[i]>dis[y])
36             y=i;
37     printf("%d",dis[y]);
38     return 0;
39 } 
View Code

相关文章: