码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ_1060_时态同步_树形DP

时间:2018-02-21 22:19:44      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:zoj   nbsp   div   最大值   +=   line   stdio.h   class   clu   

BZOJ_1060_时态同步_树形DP

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1060

分析:水水的树形DP。

用儿子的最大值更新父亲,边更新边累加ans。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1000010
#define LL long long
int head[N],to[N<<1],nxt[N<<1],val[N<<1],cnt,n,root;
LL ans,f[N];
inline void add(int u,int v,int w){
    to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;val[cnt]=w;
}
void read(int &x){
    int f=1;x=0;char s=getchar();
    while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();}
    while(s>=‘0‘&&s<=‘9‘){x=(x<<3)+(x<<1)+s-‘0‘;s=getchar();}
    x*=f;
}
void dfs(int x,int y){
    LL sum=0;
    for(int i=head[x];i;i=nxt[i]){
        if(to[i]!=y){
            dfs(to[i],x);
            sum=max(sum,f[to[i]]+val[i]);
        }
    }
    f[x]=sum;
    for(int i=head[x];i;i=nxt[i]){
        if(to[i]!=y){
        ans+=sum-(f[to[i]]+val[i]);	
        }
    }
}
int main(){
    read(n);read(root);
    int x,y,z;
    for(int i=1;i<n;i++){
        read(x),read(y),read(z);
        add(x,y,z);add(y,x,z);
    }
    dfs(root,0);
    printf("%lld",ans);
}

 

BZOJ_1060_时态同步_树形DP

标签:zoj   nbsp   div   最大值   +=   line   stdio.h   class   clu   

原文地址:https://www.cnblogs.com/suika/p/8457502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!