树的最长路径(直径)【codevs1814】

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

猜你喜欢

转载自blog.csdn.net/zhangjingyanzjyer/article/details/83067760