zoukankan      html  css  js  c++  java
  • hdu 2196 树形dp

    /*先走一遍dfs找到每个点到他的子节点的位置,回溯的时候找到最大值和次大值
    再用一个dfs来更新值,先看是否是u最长路上的点,如果是的话用最大值+权值更新最大值和次大值,否则的话用次大值+权值更新最大值和次大值
    */
    #include<stdio.h>
    #include<string.h>
    #define N  11000
    struct node
    {
        int u,v,w,next;
    } bian[N*2];
    int ma[N*2],ma2[N*2];
    int n,yong,visit[N],head[N];
    void addedge(int u,int v,int w)
    {
        bian[yong].u=u;
        bian[yong].v=v;
        bian[yong].w=w;
        bian[yong].next=head[u];
        head[u]=yong++;
    }
    int dfs(int u)
    {
        visit[u]=1;
        int max1=0,max2=0,i,f;
        for(i=head[u]; i!=-1; i=bian[i].next)
        {
            int v=bian[i].v;
            if(!visit[v])
            {
                f=dfs(v)+bian[i].w;
                if(max1<f)
                {
                    max2=max1;
                    max1=f;
                }
                else if(max2<f)
                    max2=f;
            }
        }
        ma[u]=max1;//找到最大值和次大值
        ma2[u]=max2;
        return max1;
    }
    int MAX(int a,int b)
    {
        return a>b?a:b;
    }
    void dfs1(int u)
    {
        int i;
        visit[u]=1;
        for(i=head[u]; i!=-1; i=bian[i].next)
        {
            int v=bian[i].v;
            if(visit[v])continue;
            if(bian[i].w+ma[v]!=ma[u])//如果没有在最长边上
            {
                if(ma[v]<ma[u]+bian[i].w)//和v到子节点比较更新最大值
                {
                    ma2[v]=ma[v];
                    ma[v]=ma[u]+bian[i].w;
                }
                else 
                    if(ma2[v]<ma[u]+bian[i].w)//刚开始没有考虑还需要实时更新次大值
                    ma2[v]=ma[u]+bian[i].w;
    
            }
            else
            {
                if(ma[v]<ma2[u]+bian[i].w)//在最长边上
                {
                    ma2[v]=ma[v];
                    ma[v]=ma2[u]+bian[i].w;
                }
                else if(ma2[v]<ma2[u]+bian[i].w)
                    ma2[v]=ma2[u]+bian[i].w;
            }
            dfs1(v);
        }
        return ;
    }
    int main()
    {
        int i,a,b;
        while(scanf("%d",&n)!=EOF)
        {
            yong=0;
            memset(head,-1,sizeof(head));
            for(i=2; i<=n; i++)
            {
                scanf("%d%d",&a,&b);
                addedge(i,a,b);
                addedge(a,i,b);
            }
            memset(ma,0,sizeof(ma));
            memset(ma2,0,sizeof(ma2));
            memset(visit,0,sizeof(visit));
            dfs(1);
            memset(visit,0,sizeof(visit));
            dfs1(1);
            for(i=1; i<=n; i++)
                printf("%d
    ",ma[i]);
        }
        return 0;
    }
    

  • 相关阅读:
    javaSE一些实习问题
    java并行程序基础
    http与https协议
    mybatis-plus 狂神说笔记
    弄懂java bio 和 nio 一篇就够 !!!
    异步操作Promise
    uni-app,vue-cli3或4的跨域
    7.vue之v-on
    Linux Shell 错误: $' ': command not found错误解决
    visual studio 容器工具首次加载太慢 vsdbgvs2017u5 exists, deleting 的解决方案
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410675.html
Copyright © 2011-2022 走看看