zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    第03组 Alpha冲刺(2/4)
    第03组 Alpha冲刺
    第09组 Beta版本演示
    第09组 Beta冲刺(4/4)
    第09组 Beta冲刺(3/4)
    第09组 Beta冲刺(2/4)
    第09组 Beta冲刺(1/4)
    第09组 Alpha事后诸葛亮
    第09组 Alpha冲刺(4/4)
    第09组 Alpha冲刺(3/4)
  • 原文地址:https://www.cnblogs.com/algorithms/p/2689045.html
Copyright © 2011-2022 走看看