其他分享
首页 > 其他分享> > HDU2196_Computer_求树上的每一个点可以达到的最大距离

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;
}

标签:head,一个点,int,void,HDU2196,cnt,num,Computer,dp
来源: https://blog.csdn.net/weixin_43596048/article/details/101073948