zoukankan      html  css  js  c++  java
  • 洛谷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
    ",ans);
        return 0;
    }
  • 相关阅读:
    bzoj4804
    bzoj2962
    bzoj4827
    bzoj2553
    bzoj3611
    BZOJ 1636: [Usaco2007 Jan]Balanced Lineup
    BZOJ 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    BZOJ 1634: [Usaco2007 Jan]Protecting the Flowers
    BZOJ 1631: [Usaco2007 Feb]Cow Party
    BZOJ 2582: [Usaco2012Jan]Bovine Alliance
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/12274800.html
Copyright © 2011-2022 走看看