求条!30 分
查看原帖
求条!30 分
704562
GUO120822楼主2024/8/1 16:33
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=510;
int n,m,i,ww[N],vv[N],x;
int last[N],c;
bool vis[N];
int dp[N][M];
int low[N],dfn[N],idx;
int st[N],tp;
int xx[N],yy[N],id[N];
int w[N],v[N],d,din[N];
struct Node{
	int to,next;
}a[N<<1];
void add(int u,int v)
{
	a[++c]={v,last[u]};
	last[u]=c;
}
void tarjan(int x)
{
	int i,to,t;
	low[x]=dfn[x]=++idx;
	st[++tp]=x;
	vis[x]=true;
	for (i=last[x];i;i=a[i].next)
	{
		to=a[i].to;
		if (!dfn[to])
		{
			tarjan(to);
			low[x]=min(low[x],low[to]);
		}
		else if (vis[to]) low[x]=min(low[x],dfn[to]);
	}
	if (low[x]==dfn[x])
	{
		d++;
		do
		{
			t=st[tp];
			tp--;
			vis[t]=false;
			w[d]+=ww[t];
			v[d]+=vv[t];
			id[t]=d;
		}while (t!=x);
	}
}
void dfs(int x)
{
	int i,j,k,to;
	for (i=w[x];i<=m;i++) dp[x][i]=v[x];
//	cout<<x<<"\n";
	for (i=last[x];i;i=a[i].next)
	{
		to=a[i].to;
		dfs(to);
		for (j=m;j>=w[x];j--)
		{
			for (k=0;k<=j-w[x];k++) dp[x][j]=max(dp[x][j],dp[x][j-k-w[x]]+dp[to][k]+v[x]);
		}
	}
//	for (j=1;j<=m;j++) cout<<dp[x][j]<<" ";
//	cout<<"\n";
}          
int main()
{
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++) scanf("%d",&ww[i]);
	for (i=1;i<=n;i++) scanf("%d",&vv[i]);
	for (i=1;i<=n;i++) 
	{
		scanf("%d",&x);
		if (x) add(x,i);
		xx[i]=x;
		yy[i]=i;
	}
	for (i=1;i<=n;i++)
	{
		if (!dfn[i]) tarjan(i);
	}
	memset(last,0,sizeof(last));
	c=0;
	for (i=1;i<=n;i++)
	{
		if (id[xx[i]]!=id[yy[i]]) 
		{
			add(id[xx[i]],id[yy[i]]);
			din[id[yy[i]]]++;
//			cout<<id[xx[i]]<<" "<<id[yy[i]]<<"\n";
		}
	}
//	cout<<c<<"\n";
//	for (i=1;i<=d;i++) cout<<w[i]<<" "<<v[i]<<" "<<din[i]<<"\n";
	for (i=1;i<=d;i++) 
	{
		if (!din[i]) add(0,i);
	}
	dfs(0);
	printf("%d",dp[0][m]);
	return 0;
}
2024/8/1 16:33
加载中...