洛谷P1131 时态同步

题意:

给一个n点的树,每条边都有边权,问从根出发需要增加多少长度,使得最终的儿子到根的距离是一样的

思路:

上来一个思路wa了3次,看完题解之后,又一次豁然开朗……

 

orz

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
const int maxn=5e5+10;
struct node{
    int to,next,w;
}a[maxn<<1];
int n,s,cnt,tot,head[maxn],maxx[maxn];
ll ans;
il void add(int u,int v,ll w){
    a[tot].w=w;a[tot].next=head[u];
    a[tot].to=v;head[u]=tot++;
}
void dfs(int u,int qian){
    for(it i=head[u];i!=-1;i=a[i].next){
        int v=a[i].to,w=a[i].w;
        if(v==qian){continue;}
        dfs(v,u);
        maxx[u]=max(maxx[u],maxx[v]+w);
    }
    for(it i=head[u];i!=-1;i=a[i].next){
        int v=a[i].to,w=a[i].w;
        if(v==qian){continue;}
        ans+=(ll)(maxx[u]-w-maxx[v]);
    }
}
int main(){
    scanf("%d%d",&n,&s);
    tot=0;mem(head,-1);ans=0;
    for(it i=1;i<n;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);add(v,u,w);
    }
    dfs(s,0);
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2020-02-07 22:00  ouluy  阅读(119)  评论(0编辑  收藏  举报