#include <iostream>
using namespace std;
const int maxn=2*1e4+5;
int n,fa[maxn]={0},value[maxn],Minus[maxn]={0};
//每次更新一个最靠近根节点的负数值,dfs该处
int dfs(int x){
for(int i=2;i<=n;i++){
if(fa[i]==x){
Minus[i]=Minus[x]-value[i];
dfs(i);
}
}
}
int main(){
cin>>n;
fa[1]=1;value[1]=0;
for(int i=1,t;i<=n;i++){
cin>>t;
for(int j=1,s,v;j<=t;j++){
cin>>s>>v;
if(fa[s]!=i&&fa[i]!=s){
fa[s]=i;value[s]=v;
}
}
}cin>>Minus[1];
dfs(1);
int ans=0;
for(int minum,minva;;ans++){
for(int i=1;i<=n;i++){
minva=~0x3f;
if(Minus[i]<=0&&Minus[i]>minva){
minum=i;
minva=Minus[i];
}
}if(minva==~0x3f)break;
Minus[minum]=Minus[1];
dfs(minum);
}
cout<<ans;
}
贪心,每次寻找最靠近根节点的非正数权值并将其设为根节点的权值,同时ans++