版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangjingyanzjyer/article/details/83067760
树的最长路径即树上的最远点对,也被称为树的直径。
这可以用两遍dfs来求。第一遍dfs先任选一个点,找出离这个点最远的点maxd。该点必为最长路径上的一个端点(可以用反证法证明)再从maxd这个点出发再进行一次dfs就能找到另一个端点。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,cnt,max0,maxd,x,y,maxx[210035],t[210035],head[210035],nxt[210035],to[210035],dep[100035];
void add(int x,int y)
{
cnt++;nxt[cnt]=head[x];to[cnt]=y;head[x]=cnt;
}
void dfs(int u,int fa)
{
maxx[u]=dep[u];
for (int i=head[u];i;i=nxt[i])
{
if (to[i]==fa) continue;
dep[to[i]]=dep[u]+1;
dfs(to[i],u);
maxx[u]=max(maxx[u],maxx[to[i]]);
}
if (dep[u]>max0) max0=dep[u],maxd=u;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if (x) add(i,x);
if (x) add(x,i);
if (y) add(i,y);
if (y) add(y,i);
}
max0=0;
dfs(1,0);
memset(dep,0,sizeof(dep));
max0=0;
dfs(maxd,0);
printf("%d\n",max0);
}