洛谷——P3018 [USACO11MAR]树装饰Tree Decoration

P3018 [USACO11MAR]树装饰Tree Decoration

 

比较水的一道树上模拟水题,更新每个点的价值为以这个点为根的子树中的价值最小值,同时更新以每个节点为根的$sum$值,即以这个节点为根的子树的礼物数,

如果$sum$值小于自身所规定数,就用最小值来计算剩余价值。

 

#include<iostream>
#include<cstdio>
#include<algorithm>

#define N 1000000
#define inf 0x7fffffff
#define LL long long
using namespace std;

LL n,val[N],d[N],f[N],s[N];
LL ans; 
LL head[N],tot;
struct node{
    LL to,next;
}e[N];

void add(LL u,LL v){
    e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
}

void dfs(LL u){
    for(LL i=head[u];i;i=e[i].next){
        LL v=e[i].to;
        if(v==f[u]) continue;
        dfs(v);
        val[u]=min(val[u],val[v]);
        s[u]+=s[v];
    }
    if(s[u]<d[u]) ans+=(d[u]-s[u])*val[u],s[u]=d[u];
}


int main()
{
    scanf("%lld",&n);
    for(LL i=1;i<=n;i++){
        scanf("%lld%lld%lld",&f[i],&d[i],&val[i]);
        add(i,f[i]),add(f[i],i);
    }
    for(LL i=1;i<=n;i++){
        if(f[i]==-1){
            dfs(i);
            printf("%lld\n",ans);
            break;
        }
    }
    
    return 0;
}

 

posted @ 2018-10-13 21:11  清风我已逝  阅读(197)  评论(0编辑  收藏  举报