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 }