zoukankan      html  css  js  c++  java
  • [ZJOI2007]时态同步 [动态规划 树形dp]

    P1131 [ZJOI2007]时态同步 

    要求使用最少的道具使得其同时到达叶结点

    越靠近根节点使用道具影响范围越大 但小处又不一定 故从先从叶结点开始伸长 再往祖先延伸

    可以参考这个

    #include<bits/stdc++.h>
    using namespace std;
    #define Max(x,y) (x)>(y)?(x):(y)
    #define Min(x,y) (x)>(y)?(y):(x)
    #define ll long long
    #define rg register
    const int N=500000+5,M=10000+5,inf=0x3f3f3f3f,P=99999997;
    int n,root,dis[N];
    ll ans=0;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    int head[N<<1],tot=0;
    struct edge{int v,w,nxt;}e[N<<1];
    void add(int u,int v,int w){
        e[++tot]=(edge){v,w,head[u]},head[u]=tot;
    }
    
    void dp(int u,int fa){
        for(int i=head[u],v;i;i=e[i].nxt){
            v=e[i].v;
            if(v==fa) continue;
            dp(v,u);
            dis[u]=Max(dis[u],dis[v]+e[i].w); 
        }
        for(int i=head[u],v;i;i=e[i].nxt)
        if(e[i].v!=fa) ans+=(ll)(dis[u]-(dis[e[i].v]+e[i].w));
    }
    
    int main(){
        freopen("in2.txt","r",stdin);
        rd(n),rd(root);
        for(int i=1,u,v,w;i<n;++i) rd(u),rd(v),rd(w),add(u,v,w),add(v,u,w);
        dp(root,0);
        printf("%lld",ans);
        return 0;
    }
     
  • 相关阅读:
    浅谈Semaphore类
    Python浅谈requests三方库
    191104
    191103
    191102
    191101
    191031
    191030
    191029
    191028
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11207686.html
Copyright © 2011-2022 走看看