贪心
删掉一个点的代价可知
那么通过DFS在处理出来儿子的信息后将所有儿子的代价排序,贪心地看一下是否可以删掉
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int Maxn = 2000010;
struct node {
int to,next;
}E[Maxn];
int n,m,Ans,tot,c[Maxn],H[Maxn],a[Maxn];
void Link(int u,int v){
E[++tot].to = v;
E[tot].next = H[u];
H[u] = tot;
}
void Dfs(int x){
for(int i=H[x];i;i=E[i].next)Dfs(E[i].to);
int js = 0;
for(int i=H[x];i;i=E[i].next)a[++js] = c[E[i].to];
sort(a + 1,a + js + 1);
for(int i=1;i<=js;i++){
if(c[x] + a[i] - 1 > m)break;
c[x] += a[i] - 1;Ans++;
}
}
int main(){
freopen("sakura.in","r",stdin);
freopen("sakura.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&c[i]);
for(int i=0;i<n;i++){
int k;scanf("%d",&k);c[i] += k;
for(int j=1;j<=k;j++){
int x;scanf("%d",&x);
Link(i,x);
}
}
Dfs(0);
printf("%d\n",Ans);
return 0;
}