加了初始化0x3f还只有#2AC求条
查看原帖
加了初始化0x3f还只有#2AC求条
1172806
Britney_sly楼主2025/7/2 10:29

%%%
玄关

#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;
}

奇怪马蜂

2025/7/2 10:29
加载中...