HDOJ 2196 Computer

题意:对树中每个结点求其与能到达的最远结点的距离。N<=10^4

分析:先求出树的直径(树中距离最远的2个点之间路径),对每个结点,求到达直径2个端点的距离,较大的即为结果。

View Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 10001
int n,e;
int first[N],next[N<<1],v[N<<1],w[N<<1];
int dx[N],dy[N];
void init()
{
    e=0;
    memset(first+1,-1,sizeof(first[0])*n);
}
void add(int a,int b,int c)
{
    v[e]=b;
    w[e]=c;
    next[e]=first[a];
    first[a]=e++;
}
void dfs(int a,int fa,int dist,int *d)
{
    int i,b;
    for(i=first[a];~i;i=next[i])
    {
        b=v[i];
        if(b^fa)    dfs(b,a,d[b]=dist+w[i],d);
    }
}
int main()
{
    int a,b,c;
    while(~scanf("%d",&n))
    {
        init();
        for(a=2;a<=n;a++)
        {
            scanf("%d%d",&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        dfs(1,0,dx[1]=0,dx);
        int x,y;

        x=1;
        for(int i=2;i<=n;i++)
        {
            if(dx[i]>dx[x]) x=i;
        }

        dfs(x,0,dx[x]=0,dx);

        y=1;
        for(int i=2;i<=n;i++)
        {
            if(dx[i]>dx[y]) y=i;
        }
        dfs(y,0,dy[y]=0,dy);

        for(int i=1;i<=n;i++)   printf("%d\n",max(dx[i],dy[i]));
    }
    return 0;
}
posted @ 2012-09-17 17:19  BeatLJ  阅读(205)  评论(0编辑  收藏  举报