提交记录翻了好多页就没个和我错一样的…
#include<bits/stdc++.h>
#define N 1200
using namespace std;
int n,m,ind,cnt;
int w[N],vv[N],rd[N],l[N],r[N],f[N][N],d[N];
int w1[N],v1[N];
int dfn[N],low[N],sd[N];
bool instack[N],edge[N][N];
stack<int>st;
vector<int>g[N],g1[N];
void tarjan(int u)
{
instack[u]=1;
dfn[u]=low[u]=++ind;
st.push(u);
for(int v:g[u])
{
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
cnt++;
while(1)
{
int v=st.top();
sd[v]=cnt;
w1[cnt]+=w[v];
v1[cnt]+=vv[v];
instack[v]=0;
st.pop();
if(u==v)break;
}
}
}
void dfs1(int u,int fa)
{
for(int v:g1[u])
{
if(v==fa)continue;
r[v]=l[u];
l[u]=v;
dfs1(v,u);
}
}
void dfs2(int u)
{
if(l[u])dfs2(l[u]);
if(r[u])dfs2(r[u]);
for(int i=0;i<=m;i++)
{
f[u][i]=f[r[u]][i];
for(int j=0;j<=i-w1[u];j++)
f[u][i]=max(f[u][i],f[l[u]][j]+f[r[u]][i-j-w1[u]]+v1[u]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",w+i);
for(int i=1;i<=n;i++)scanf("%d",vv+i);
for(int i=1;i<=n;i++)
{
scanf("%d",d+i);
if(d[i])g[d[i]].push_back(i);
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)
{
if(sd[d[i]]==sd[i])continue;
g1[sd[d[i]]].push_back(sd[i]);
rd[sd[i]]++;
}
for(int i=1;i<=cnt;i++)if(!rd[i])g1[0].push_back(i);
dfs1(0,0);
dfs2(0);
printf("%d\n",f[0][m]);
return 0;
}