%%%
玄关
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define itn long long
const int N=101,M=501;
int n,m,cnt=0,tot,top,root;
int fa[N],dis[N],id[N],low[N],dfn[N],st[N],book[N],f[N][M],in[N],c[N],v[N],a[N];
vector<int> edge[N],g[N];
void tarjan(int x){
low[x]=dfn[x]=++cnt;
book[x]=1,st[++top]=x;
for(int i=0;i<edge[x].size();i++){
int y=edge[x][i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else{
low[x]=min(low[x],low[y]);
}
}
if(low[x]==dfn[x]){
itn b;tot++;
do{
b=st[top--];id[b]=tot;
book[b]=0;
v[tot]+=dis[b];a[tot]+=c[b];
}while(b!=x);
}
}
void dfs(int x){
for(int i=v[x];i<=m;i++)f[x][i]=c[x];
for(int i=0;i<edge[x].size();i++){
int y=edge[x][i];
dfs(y);
for(int j=m;j>=v[x];j--){
for(int q=0;q<=j;q++){
f[x][j]=max(f[x][j],f[y][q]+f[x][j-q]);
}
}
}
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&dis[i]);
for(int i=1;i<=n;i++)scanf("%d",&c[i]);
for(int i=1;i<=n;i++){
scanf("%d",&fa[i]);
if(fa[i])edge[i].push_back(fa[i]);
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan[i];
for(int i=1;i<=n;i++)edge[i].clear();
for(int i=1;i<=n;i++){
if(id[fa[i]]!=id[i]){
edge[id[fa[i]]].push_back(id[i]);
in[id[i]]++;
}
}
memset(f,-0x3f,sizeof(f));
for(int i=1;i<=tot;i++){
if(in[i]==0){
edge[0].push_back(i);
}
}
dfs(0);
printf("%d\n",f[0][m]);
return 0;
}
奇怪马蜂