Rt,代码如下
#include<bits/stdc++.h>
using namespace std;
int n,ans;
struct point
{
int k,dep,from,s,v1,v2;
}a[300010];
bool depcmp(point x,point y)
{
return x.dep>y.dep;
}
int change[300010];
struct edge
{
int to,next;
}e[300010];
int cnt,head[300010];
int add(int x,int y)
{
e[++cnt].to=y;
e[cnt].next=head[x];
head[x]=cnt;
}
int dep(int k)
{
a[k].dep=a[a[k].from].dep+1;
for(int i=head[k];i;i=e[i].next)
{
a[k].s++;
if(e[i].to==a[k].from) continue;
a[e[i].to].from=k;dep(e[i].to);
}
}
int main()
{
cin>>n>>n;n++;
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
a[i].k=i;
}
dep(1);
sort(a+1,a+n+1,depcmp);
for(int i=1;i<=n;i++)
{
change[a[i].k]=i;
}
for(int i=1;i<=n;i++)
{
int f=change[a[i].from],v=a[i].v1+a[i].s-1;
if(a[i].v1==0) v++;
if(v>a[f].v1) a[f].v2=a[f].v1,a[f].v1=v;
else if(v>a[f].v2) a[f].v2=v;
ans=max(ans,a[i].v1+a[i].v2+a[i].s-1);
}
// for(int i=1;i<=n;i++)
// {
// cout<<a[i].k<<" "<<a[i].dep<<" "<<a[i].from<<" "<<a[i].s<<" "<<a[i].v1<<" "<<a[i].v2<<" "<<a[i].v1+a[i].v2+a[i].s-1<<endl;
// }
cout<<ans<<endl;
return 0;
}