链接
题意:
给定每个大坝先有水量以及总容量,超过总容量时就会流向下一级(靠近根)的大坝。问最少需要多少新的水可以使整个大坝体系的根崩溃?只往一个里面加水
分析:
首先我们知道要冲垮最后一个大坝也就是sum,然后我们用m表示所需的最小水量。我们用a[i]表示大坝容量,用b[i]表示大坝当前的水。
所以我们现在可以这样考虑状态:
-
a[i]>sum,那么我们直接可以用a[i]-b[i]来代替sum和m,即a[i]-b[i]代替了最后一个大坝
-
a[i]<=sum,那么我们可以直接将其 b[i]灌入大坝,因为我们要冲垮最后一个大坝的水量一定大于a[i],所以 我们一定是冲垮a[i]之后过来的,就相当于我们直接把b[i]拿过来了。也就是sum变成sum-b[i],需要最小水量m变成m-b[i].
///苟利国家生死以,岂因祸福避趋之
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int ,int >
#define ll long long
const int mod = 1e9 + 7;
const int maxn = 2e5 + 7;
struct node {
ll x,y,id;
};
std::vector<node> v[maxn];
ll n,m;
ll ans;
void dfs(ll num,ll sum,ll mm){
ans=min(ans,mm);
if(sum<=0) return ;
for(int i=0;i<v[num].size();i++){
node top=v[num][i];
if(top.x>sum){
//if(top.x-top.y<=mm){
dfs(top.id,top.x-top.y,top.x-top.y);
//}
}else {
dfs(top.id,sum-top.y,mm-top.y);
}
}
}
int main()
{
cin >> n>>m;
ans=m;
for(ll i=1;i<=n;i++){
ll pre,x,y;
cin>>pre>>x>>y;
v[pre].push_back({x,y,i});
}
dfs(0,m,m);
cout<<ans<<endl;
return 0;
}