zoukankan      html  css  js  c++  java
  • BZOJ1060:[ZJOI2007]时态同步——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1060

    https://www.luogu.org/problemnew/show/P1131

    小Q在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在一条通路(通路指连接两个元件的导线序列)。

    在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点。而中间节点接收到激励电流后,得到信息,并将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终,激烈电流将到达一些“终止节点”――接收激励电流之后不再转发的节点。

    激励电流在导线上的传播是需要花费时间的,对于每条边e,激励电流通过它需要的时间为te,而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路――即保持时态同步。由于当前的构造并不符合时态同步的要求,故需要通过改变连接线的构造。目前小Q有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请问小Q最少使用多少次道具才可使得所有的“终止节点”时态同步?

    题面很长,看完就知道是树上dp裸题且很简单。

    (然后我就傻了少加了很多东西)

    显然对于给定的一个节点,其子树上的最晚时间即是最优时间。

    所以维护dp[i][0]为i节点往下传的最晚时间,dp[i][1]为i的子树用了多少道具。

    所以我们有

    dp[u][1]+=dp[u][0]-dp[v][0]-w+dp[v][1];

    很显然吧。

    (然而请一定提前更新最晚时间,不要边找最大值边更新dp1不然你就会像我一样卡在sb题上。)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=5e5+5;
    inline int read(){
        int X=0,w=0;char ch=0;
        while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    struct node{
        int to,nxt;
        ll w;
    }e[N*2];
    int n,rt,cnt,head[N];
    ll dp[N][2];
    inline void add(int u,int v,ll w){
        e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
    }
    void dfs(int u,int f){
        for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;ll w=e[i].w;
        if(v==f)continue;
        dfs(v,u);
        dp[u][0]=max(dp[u][0],dp[v][0]+w);
        }
        for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;ll w=e[i].w;
        if(v==f)continue;
        dp[u][1]+=dp[u][0]-dp[v][0]-w+dp[v][1];
        }
    }
    int main(){
        n=read();rt=read();
        for(int i=1;i<n;i++){
        int u=read(),v=read(),w=read();
        add(u,v,w);add(v,u,w);
        }
        dfs(rt,0);
        printf("%lld
    ",dp[rt][1]);
        return 0;
    }

    +++++++++++++++++++++++++++++++++++++++++++

     +本文作者:luyouqi233。               +

     +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

    +++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8503861.html
Copyright © 2011-2022 走看看