装饰树题解,信奥队为了迎接即将到来的春节,让每位同学去装饰树,无聊的不行就整了一题出来
Code:
#include<iostream>
#include<vector>
using namespace std;
long long n,p,c[100005],t[100005],ac[100005],minx[100005],ans;
vector<int>v[100005];
void dfs(int x){
minx[x]=t[x];
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
dfs(y);
ac[x]+=ac[y];
minx[x]=min(minx[x],minx[y]);
}
if(ac[x]<c[x]){
ans+=minx[x]*(c[x]-ac[x]);
ac[x]=c[x];
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>p>>c[i]>>t[i];
if(p!=-1){
v[p].push_back(i);
}
}
dfs(1);
cout<<ans<<endl;
return 0;
}