LG1131 「ZJOI2007」时态同步 树形DP

问题描述

LG1131


题解

正难则反,把从一个点出发到叶子结点看做从叶子结点走到那个点。

DP方程很显然。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

#define int long long

void read(int &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=500000+7;

int n,mx[maxn],opt[maxn],S,dis[maxn];
int Head[maxn],to[maxn*2],tot=1,Next[maxn*2],w[maxn*2];
int ans;

void add(int x,int y,int z){
    to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
} 

void dfs(int x,int f){
    for(int i=Head[x];i;i=Next[i]){
        int y=to[i];
        if(y==f) continue;dfs(y,x);
    }
    for(int i=Head[x];i;i=Next[i]){
        int y=to[i];
        if(y==f) continue;
        mx[x]=max(mx[x],w[i]);
    }
    for(int i=Head[x];i;i=Next[i]){
        int y=to[i];
        if(y==f) continue;
        ans=ans+mx[x]-w[i];
    }
    for(int i=Head[f];i;i=Next[i]){
        int y=to[i];
        if(y==x) w[i]+=mx[x];
    }
}

signed main(){
    read(n);read(S);
    for(int i=1,x,y,z;i<n;i++){
        read(x);read(y);read(z);
        add(x,y,z);add(y,x,z);
    }
    dfs(S,0);
    printf("%lld\n",ans);
    return 0;
}
全部评论

相关推荐

07-14 13:47
门头沟学院 Java
Lynn012:你评估好自己的位置了吗《顶尖应届》
投递小米集团等公司8个岗位
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
弦五Strings:他之所以会举报你代课是因为在这种人眼里正常上课就是正义代课就是邪恶,典型二极管思维,处理方法就是私下沟通,你就说你自己家里经济困难或者家里父母生病什么之类的,需要去打工挣钱,用尽孝的正义对冲他认为的上课的正义,他可能就妥协了。
我的实习日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务