树的直径:树中两节点距离的最大值称为树的直径。
dfs法:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,u,v;
const int N=100010;
int dis[N];
int head[100100],size,c,z;
struct node{
int from,to,dis,nxt;
}edge[N*2];
void add(int from,int to)
{
edge[++size].nxt=head[from];
edge[size].to=to;
head[from]=size;
}
void dfs(int u,int fa)
{
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa) continue;
dis[v]=dis[u]+1;
if(dis[v]>dis[c]) c=v;
dfs(v,u);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs(1,0);//选1号点作为根节点出发
z=dis[c];
dis[c]=0;
dfs(c,0);//以离1号点最远的点作为根,再次找最远的点。
printf("%d\n",max(z,dis[c])-1);
return 0;
}