5 1 1 2 1 3 1 1 1
3 2 3 4 4
求树上一点到其它点的最远距离,先以任一点为根节点,进行一次bfs搜到距离当前点最远的点root1,从root1开始再搜,得到root2,从root2再搜一次得到最终答案,每次搜的过程中更新每个点的最远距离。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
#define N 11000
#define mem(a,t) memset(a,t,sizeof(a))
struct node
{
int v,w,next;
}e[N*2];
int head[N];
int dis[N];
int cnt;
int len_max,root;
void add(int u,int v,int w)
{
e[cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt++;
}
void bfs(int u,int len,int fa)
{
int i,v;
if(len>len_max)
{
len_max=len;
root=u;
}
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(v!=fa)
{
if(dis[v]<len+e[i].w)
dis[v]=len+e[i].w;
bfs(v,len+e[i].w,u);
}
}
return ;
}
int main()
{
int i,n,a,b;
while(~scanf("%d",&n))
{
mem(head,-1);
cnt=0;
for(i=2;i<=n;i++)
{
scanf("%d%d",&a,&b);
add(i,a,b);
add(a,i,b);
}
mem(dis,0);
len_max=0;
bfs(1,0,-1);
len_max=0;
bfs(root,0,-1);
bfs(root,0,-1);
for(i=1;i<=n;i++)
printf("%d\n",dis[i]);
}
return 0;
}
原文:http://blog.csdn.net/u011721440/article/details/45369405