• P1131 [ZJOI2007]时态同步(树形dp)


    P1131 [ZJOI2007]时态同步

    设$f[i]$为与$i$与最远的点的距离

    在dfs时每次更新的时候顺便统计一下长度,不同的话就改成最长的那条并更新答案

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cctype>
    #define re register
    using namespace std;
    void read(int &x){
        char c=getchar(); x=0;
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    }
    #define N 500002
    typedef long long ll;
    int n,s; ll ans,f[N];;
    int cnt,hd[N],nxt[N<<1],ed[N],poi[N<<1],val[N<<1];
    void adde(int x,int y,int v){
        nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
        ed[x]=cnt; poi[cnt]=y; val[cnt]=v;
    }
    void dfs(int x,int fa){
        for(int i=hd[x],t=0;i;i=nxt[i],++t){
            int to=poi[i];
            if(to==fa) {--t;continue;}
            dfs(to,x);
            ll v=f[to]+val[i];
            if(v>f[x]){//更新答案
                ans+=1ll*(v-f[x])*t;
                f[x]=v;
            }else ans+=f[x]-v;
        }
    }
    int main(){
        read(n); read(s); int q1,q2,q3;
        for(re int i=1;i<n;++i){
            read(q1); read(q2); read(q3);
            adde(q1,q2,q3); adde(q2,q1,q3);
        }dfs(s,0);
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    推箱子
    为textarea增加maxlength属性(转)
    validate
    keypress
    Knockout
    &amp; replace &
    银联参数
    chinapay
    model binding
    JSON.stringify
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/9824938.html
Copyright © 2020-2023  润新知