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;
    }
  • 相关阅读:
    Java基础教程(20)--数字和字符串
    Java基础教程(19)--Object类
    python 选择和循环结构
    购物清单
    第五次安卓作业(计算器和增删改查)
    第四次安卓作业(用户添加)
    第三次安卓作业(用户登录)
    第二次安卓作业(九宫格)
    5.22作业
    5.29作业
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/12274800.html
Copyright © 2011-2022 走看看