www.luogu.com.cn/record/233732309
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],c,s[105],er,d[105],l[105],t,o,ans,e[105],v[105],f[105],vv[105],ee[105],ff[105][505];
vector<int> w[105];
vector<int> w1[105];
queue<int> q;
void dfs(int x){
d[x]=l[x]=++er;s[++t]=x;
for(auto it:w[x]){
if(!d[it])dfs(it),l[x]=min(l[x],l[it]);
else if(!a[it])l[x]=min(l[x],d[it]);
}
if(d[x]==l[x]){
c++;
int tp=-1;
while(tp!=x){
tp=s[t];t--;
a[tp]=c;
}
}
}
void dfs1(int x,int fa){
for(auto it:w1[x]){
if(it==fa)continue;
dfs1(it,x);
}
ff[x][0]=0;ff[x][ee[x]]=vv[x];
for(auto it:w1[x]){
if(it==fa)continue;
for(int i=m;i>=min(1,ee[x]);i--){
for(int j=min(1,ee[x]);j<=i;j++){
ff[x][i]=max(ff[x][i],ff[x][j]+ff[it][i-j]);
}
}
}
for(int i=1;i<=m;i++)ff[x][i]=max(ff[x][i],ff[x][i-1]);
}
int main(){
memset(ff,-0x3f,sizeof ff);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>e[i];
for(int i=1;i<=n;i++)cin>>v[i];
for(int i=1,u;i<=n;i++){
cin>>u;
w[u].push_back(i);
}
for(int i=1;i<=n;i++){
if(!d[i]){
dfs(i);
}
}
for(int i=1;i<=n;i++){
vv[a[i]]+=v[i];ee[a[i]]+=e[i];
for(auto it:w[i]){
if(a[i]!=a[it])w1[a[i]].push_back(a[it]),f[a[it]]++;
}
}
for(int i=1;i<=n;i++)if(!f[i])w1[0].push_back(i);
dfs1(0,-1);
ff[0][m]=0;
for(auto it:w1[0]){
for(int i=m;i>=0;i--){
for(int j=0;j<=i;j++){
ff[0][i]=max(ff[0][i],ff[0][j]+ff[it][i-j]);
}
}
}
int ans=0;
for(int i=0;i<=m;i++)ans=max(ans,ff[0][m]);
cout<<ans;
return 0;
}