• hdu_5834 Magic boy Bi Luo with his excited tree


    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <algorithm> 
    using namespace std;
    int T,n,val[100010],c_back[100010],c[100010],ans[100010],choose[100010];
    struct edge{int v,w;};
    vector<edge> G[100010];
    
    void dfs(int u,int fa){
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].v,w=G[u][i].w;
            if(v==fa)continue;
            dfs(v,u);
            if(c_back[v]-w*2+val[v]>0)c_back[u]+=c_back[v]-w*2+val[v];
        }
        c[u]=c_back[u]; 
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].v,w=G[u][i].w;
            if(v==fa)continue;
            if(c_back[v]-w*2+val[v]>0){
            	if(c_back[u]-c_back[v]+w+c[v]>c[u])choose[u]=v;
    			c[u]=max(c[u],c_back[u]-c_back[v]+w+c[v]);
    		}
            else {
            	if(c_back[u]+c[v]+val[v]-w>c[u])choose[u]=v;
    			c[u]=max(c[u],c_back[u]+c[v]+val[v]-w);
    		}
        }
    }
    
    void dfs2(int u,int fa,int last){
        int re,re_c,re_=c_back[u],re_c_=c[u],rechoose,rechoose_=choose[u];
        if(fa!=-1){
        	re_c=c[fa],re=c_back[fa],rechoose=choose[fa];
            if(c_back[u]-2*last>0)c_back[fa]-=(c_back[u]-2*last);
            if(c_back[fa]-2*last>0)c_back[u]+=(c_back[fa]-2*last);
            if(choose[fa]!=u && re_-2*last>0)c[fa]-=(re_-2*last);
            else {
    			c[fa]=c_back[fa];
    			for(int i=0;i<G[fa].size();i++){
    	            int v=G[fa][i].v,w=G[fa][i].w;
    	            if(v==u)continue;
    	            if(c_back[v]-w*2>0){
    					if(c_back[fa]-c_back[v]+w+c[v]>c[fa])choose[fa]=v;
    	            	c[fa]=max(c[fa],c_back[fa]-c_back[v]+w+c[v]);
    	            }
    	            else {
    					if(c_back[fa]+c[v]-w>c[fa])choose[fa]=v;
    					c[fa]=max(c[fa],c_back[fa]+c[v]-w);
    				}
    			}
            }
        }
        if(c_back[fa]-2*last>0)c[u]+=(c_back[fa]-2*last);
        if(c_back[fa]-last*2>0)c[u]=max(c[u],c_back[u]-c_back[fa]+last+c[fa]);
        else c[u]=max(c[u],c_back[u]+c[fa]-last);
        ans[u]=c[u];
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].v,w=G[u][i].w;
            if(v==fa)continue;
            dfs2(v,u,w);
        }
        if(fa!=-1){
    		c_back[fa]=re;
        	c[fa]=re_c;
        	choose[fa]=rechoose;
        }
        c_back[u]=re_;
        c[u]=re_c_;
        choose[u]=rechoose_;
    }
    
    int main(){
        scanf("%d",&T);
        for(int t=1;t<=T;t++){
            scanf("%d",&n);
            for(int i=1;i<=n;i++)scanf("%d",&val[i]);
            for(int i=1;i<n;i++){
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                G[u].push_back((edge){v,w});
                G[v].push_back((edge){u,w});
            }
            dfs(1,-1);
            for(int i=1;i<=n;i++)c[i]+=val[i],c_back[i]+=val[i];
            dfs2(1,-1,0);
            printf("Case #%d:
    ",t);
            for(int i=1;i<=n;i++)printf("%d
    ",ans[i]);
            for(int i=1;i<=n;i++)G[i].clear(),c[i]=c_back[i]=choose[i]=0;
        }
        return 0;
    }
    
    /*
    1
    5
    4 1 7 7 7 
    1 2 6
    1 3 1
    2 4 8
    3 5 2
    */
    
    /*
    1
    9
    22 78 78 43 86 90 96 27 31
    1 2 50
    2 3 49
    2 4 6
    3 5 80
    1 6 23
    1 7 93
    3 8 66
    3 9 61
    */
    

      

  • 相关阅读:
    【数位dp】Beautiful Numbers @2018acm上海大都会赛J
    【状压dp】Trie 树 @中山纪念中学20170304
    两个给点染色的问题-树上染色与图上染色
    【贪心】经营与开发 @upc_exam_5500
    【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
    【并查集】Connectivity @ABC049&amp;ARC065/upcexam6492
    【倍增】T-shirt @2018acm徐州邀请赛 I
    Sparse Coding: Autoencoder Interpretation
    Sparse Coding
    Pooling
  • 原文地址:https://www.cnblogs.com/codetogether/p/13697253.html
Copyright © 2020-2023  润新知