思路
不要想复杂就好了...
贪心的选取子树中最小的那个,多了就不要选,少了就更新数量...
一个dfs就可以解决了..
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
vector<int>g[N];
int w[N],least[N],sz[N];
ll dfs(int u)
{
ll res=0;
for(int v:g[u])
{
res+=dfs(v);
w[u]=min(w[u],w[v]);
sz[u]+=sz[v];
}
if(sz[u]<least[u]) res+=(least[u]-sz[u])*w[u],sz[u]=least[u];
return res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int v;
scanf("%d%d%d",&v,&least[i],&w[i]);
if(v==-1) continue;
g[v].push_back(i);
}
cout<<dfs(1)<<'\n';
return 0;
}

京公网安备 11010502036488号