求调40pts
查看原帖
求调40pts
937538
gmb7291234楼主2025/8/29 17:15

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;
}
2025/8/29 17:15
加载中...