点击查看折叠代码块
/*
两次dfs
第一次定一个根找离他最远的点
然后以该点为根再找离他最远的点
参考:https://www.cnblogs.com/handsome-zyc/p/11237529.html
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
const int inf=0x3f3f3f3f;
int n;
struct edge{
int v,w;
edge (int a=0,int b=0):v(a),w(b){}
};
vector<edge>G[maxn];
int d[maxn];
int ans=0;
int top_x;
void dfs(int x,int f){
if(d[x]>ans){
ans=d[x];
top_x=x;
}
for (int i=0;i<G[x].size();i++){
int v=G[x][i].v;
if(v==f) continue;
int w=G[x][i].w;
d[v]=d[x]+1;
dfs(v,x);
}
}
int main(){
scanf("%d",&n);
for (int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(edge(v,1));
G[v].push_back(edge(u,1));
}
dfs(1,0);
d[top_x]=0;
ans=0;
dfs(top_x,0);
printf("%d\n",ans);
return 0;
}