HDU2196_Computer_求樹上的每一個點可以達到的最大距離

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int num=1e4+10;
struct node
{
    int v,next,w;
}e[2*num];
int head[2*num],cnt;
int dp[num][2];
void int_i(void)
{
    memset(dp,0,sizeof(dp));
    memset(head,0,sizeof(head));
    cnt=0;
    return ;
}
void addedge(int u,int v,int w)
{
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
    return ;
}
void dfs1(int u,int f)
{
    int L=0,R=0;//L>=R
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].v;
        if(v==f) continue;
        dfs1(v,u);
        if(dp[v][1]+e[i].w>=L)
        {
            swap(L,R);
            L=dp[v][1]+e[i].w;
        }
        else if(dp[v][1]+e[i].w>R)
        {
            R=dp[v][1]+e[i].w;
        }
    }
    dp[u][0]=R;
    dp[u][1]=L;
    return ;
}
void dfs2(int u,int f)//更新每個節點的dp[][0],dp[][1];
{
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].v;
        if(v==f) continue;
        int s;
        s=(dp[v][1] + e[i].w ==dp[u][1])?0:1;

        if(dp[u][s] + e[i].w >= dp[v][1])
        {
            swap(dp[v][0],dp[v][1]);
            dp[v][1]=dp[u][s]+e[i].w;
        }
        else if(dp[u][s] + e[i].w > dp[v][0])
        {
            dp[v][0]=dp[u][s]+e[i].w;
        }
        dfs2(v,u);
    }
    return ;
}
int main()
{
    int n,u,w;
    while(scanf("%d",&n)!=EOF)
    {
        int_i();
        for(int i=2;i<=n;i++)
        {
            scanf("%d%d",&u,&w);
            addedge(u,i,w);
            addedge(i,u,w);
        }

        dfs1(1,-1);
        dfs2(1,-1);
        for(int i=1;i<=n;i++)
            printf("%d\n",max(dp[i][1],dp[i][0]));
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章