树的直径

树的直径(最长路) 的详细证明

两次BFS求树的直径(算法导论22.2-7)

 

#include
#include
#include
#include
#include
#include
using namespace std;
int n;
int nxt[400005]={0},head[400005]={0},to[400005]={0},num=0;
int dep[200005]={0},b[200005]={0},q[200005]={0},l=1,r=0;
int dx,d;


void add(int x,int y)
{
	nxt[++num]=head[x];
	head[x]=num;
	to[num]=y;
}

void bfs(int root)
{
	memset(dep,0,sizeof(dep));
	memset(b,0,sizeof(b));
	memset(q,0,sizeof(q));
	l=1;r=0;d=0;
	q[++r]=root; b[root]=1; dep[root]=0;
   

	while(l<=r)
	{
		int x=q[l++];
	    for(int i=head[x];i;i=nxt[i])
	    {
	    	int y=to[i];
	    	if(b[y]==1) 	continue;
	     	q[++r]=y; b[y]=1; dep[y]=dep[x]+1;
	        if(dep[y]>d) d=dep[y],dx=y;
	    }
	}
	

}

int main()
{
	scanf("%d",&n);
	int x,y;
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	
	bfs(1);
	bfs(dx);
	printf("%d",d);
	
	return 0;
}

 

你可能感兴趣的:(树的直径)