贪心
#include<cstdio> #include<algorithm> using namespace std; int cnt,n,m,F[2000005],c[2000005],last[2000005],G[2000005],E[2000005]; struct node{ int to,next; }e[2000005]; void add(int a,int b){ e[++cnt].to=b; e[cnt].next=last[a]; last[a]=cnt; } void dfs(int x){ for (int i=last[x]; i; i=e[i].next){ int V=e[i].to; dfs(V); } int cnt=0; F[x]=c[x]; for (int i=last[x]; i; i=e[i].next){ int V=e[i].to; F[x]++; E[++cnt]=F[V]-1; G[x]+=G[V]; } sort(E+1,E+cnt+1); for (int i=1; i<=cnt; i++) if (F[x]+E[i]<=m){ F[x]+=E[i]; G[x]++; } } int main(){ scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) scanf("%d",&c[i]); for (int i=0; i<n; i++){ int K; scanf("%d",&K); while (K--){ int x; scanf("%d",&x); add(i+1,x+1); } } dfs(1); printf("%d ",G[1]); return 0; }