链接:http://hihocoder.com/problemset/problem/1224
//深搜一遍求最大深度,从最大深度的叶子回溯到根的所经过的每个顶点在深搜求最大深度
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=100000+10;
struct Node
{
int v,next;
}Edge[maxn];
struct node
{
int start,step;
}p[maxn];
int head[maxn],vis[maxn],length[maxn],pre[maxn],temp,ldeepv;
void add(int u,int v,int index)
{
Edge[index].v=v;
Edge[index].next=head[u];
head[u]=index;
}
void dfs(int v,int length) //求最大深度
{
if(temp<length)
{
temp=length;
ldeepv=v;
}
if(vis[v]) return;
vis[v]=1;
for(int i=head[v];i!=-1;i=Edge[i].next)
{
if(!vis[Edge[i].v])
dfs(Edge[i].v,length+1);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int a,b,cnt=0;
memset(head,-1,sizeof(head));
memset(length,0,sizeof(length));
memset(pre,0,sizeof(pre));
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b,i);
pre[b]=a;
}
ldeepv=temp=0;
dfs(1,0);
length[cnt++]=temp; //存入length
// printf("%d\n",temp);
int k=ldeepv;
memset(vis,0,sizeof(vis));
while(pre[k]!=0) //回溯
{
vis[k]=1;
k=pre[k];
temp=0;
dfs(k,0);
length[cnt++]=temp;
}
sort(length,length+cnt);
printf("%d\n",length[cnt-1]+length[cnt-2]);
}
return 0;
}