0pts求条(玄关
查看原帖
0pts求条(玄关
1029048
luogu_starblue楼主2024/7/30 08:27
#include<bits/stdc++.h>
using namespace std;
const int maxn=109;
int head[maxn],nxt[maxn],fr[maxn],to[maxn],tot;
void add(int u,int v)
{
	if(u==0)return ;
	nxt[++tot]=head[u];
	head[u]=tot;
	fr[tot]=u;
	to[tot]=v;
}
int W[maxn],V[maxn];
int dfn[maxn],low[maxn],cnt;
int st[maxn],top;
bool in[maxn];
int scc[maxn],SCC;
void tarjan(int u)
{
	dfn[u]=low[u]=++cnt;
	st[++top]=u;
	in[u]=true;
	for(int i=head[u];i!=-1;i=nxt[i])
	{
		int v=to[i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(in[v])
		{
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u])
	{
		int uu;
		SCC++;
		do
		{
			uu=st[top--];
			in[uu]=false;
			scc[uu]=SCC;
		}while(uu!=u);
	}
}
int f[109][509];
int n,m;
int nv[109],nw[109];
bool vis[109];
void dfs(int u)
{
	f[u][nw[u]]=nv[u];
	for(int i=head[u];i!=-1;i=nxt[i])
	{
		int v=to[i];
		dfs(v);
		for(int j=m;j>=0;j--)
		{
			for(int k=0;j-k>=0;k++)
			{
				f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]);
			} 
		}
	}
}
int deg[maxn];
int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&W[i]);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&V[i]);
	}
	for(int i=1;i<=n;i++)
	{
		int u;
		scanf("%d",&u);
		add(u,i);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			tarjan(i);
		}
	}
	memset(head,-1,sizeof(head));
	int TOT=tot;
	tot=0;
	for(int i=1;i<=TOT;i++)
	{
		int u=fr[i],v=to[i];
		u=scc[u],v=scc[v];
		if(u==v)continue;
		add(u,v);
		++deg[v];
	}
	for(int i=1;i<=SCC;i++)
	{
		if(!deg[i])add(SCC+1,i);	
	}
	for(int i=1;i<=n;i++)
	{
		nw[scc[i]]+=W[i];
		nv[scc[i]]+=V[i];	
	} 
	dfs(SCC+1);
	int ans=0;
	for(int i=0;i<=m;i++)
	{
		ans=max(ans,f[SCC+1][i]);
	}
	printf("%d",ans);
//	queue<int>q;
//	for(int i=1;i<=n;i++)
//	{
//		if(!deg[i])
//		{
//			q.push(i); 
//		}
//	}
//	while(!q.empty())
//	{
//		int u=q.front();
//		f[u][w[u]]=v[u];
//		q.pop();
//		for(int i=head[u];i!=-1;i=nxt[i])
//		{
//			int v=to[i]; 
//			for(int j=m;j>=1;j--)
//			{
//				
//			} 
//			if(--deg[v])q.push(v);	
//		}
//	}
	return 0;
}

2024/7/30 08:27
加载中...