#include<bits/stdc++.h>
#define ll long long
#define rg register ll
using namespace std;
const ll M=50005,N=6e7+5;
ll n,m,b[M][1305],h[M],v[M],w[M],c[M],d[M],f1[M],f[N],mm;
inline ll max(ll x,ll y){
return x>y?x:y;
}
inline ll dfs(int x){
ll m2=m;
for(rg i=1;i<=b[x][0];++i) dfs(b[x][i]);
m++;
c[m]=w[x];
d[m]=v[x];
f1[m]=m2;
}
int main(){
freopen("treebag.in","r",stdin);
freopen("treebag.out","w",stdout);
cin>>m>>n;
for(rg i=1;i<=m;++i) cin>>h[i];
for(rg i=1;i<=m;++i) cin>>w[i];
for(rg i=1;i<=m;++i) cin>>v[i];
for(rg i=1;i<=m;++i){
if(h[i]!=0){
b[h[i]][0]++;
b[h[i]][b[h[i]][0]]=i;
}
}
mm=m;
m=0;
for(rg i=1;i<=mm;++i) if(h[i]==0) dfs(i);
for(rg i=1;i<=m;++i){
for(rg j=n;j>=1;--j){
if(j>=c[i]) f[i*(n+1)+j]=max(f[f1[i]*(n+1)+j],f[(i-1)*(n+1)+j-c[i]]+d[i]);
else f[i*(n+1)+j]=f[f1[i]*(n+1)+j];
}
}
cout<<f[m*(n+1)+n];
}
上面是此蒟蒻树形背包的代码,时超挂掉了。求助