70 分求助 WA #1 #3 #4
查看原帖
70 分求助 WA #1 #3 #4
375403
NASFsky楼主2023/8/16 14:38

提交记录翻了好多页就没个和我错一样的…

#include<bits/stdc++.h>
#define N 1200
using namespace std;
int n,m,ind,cnt;
int w[N],vv[N],rd[N],l[N],r[N],f[N][N],d[N];
int w1[N],v1[N];
int dfn[N],low[N],sd[N];
bool instack[N],edge[N][N];
stack<int>st;
vector<int>g[N],g1[N];
void tarjan(int u)
{
	instack[u]=1;
	dfn[u]=low[u]=++ind;
	st.push(u);
	for(int v:g[u])
	{
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(instack[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		cnt++;
		while(1)
		{
			int v=st.top();
			sd[v]=cnt;
			w1[cnt]+=w[v];
			v1[cnt]+=vv[v];
			instack[v]=0;
			st.pop();
			if(u==v)break;
		}
	}
}
void dfs1(int u,int fa)
{
	for(int v:g1[u])
	{
		if(v==fa)continue;
		r[v]=l[u];
		l[u]=v;
		dfs1(v,u);
	}
}
void dfs2(int u)
{
	if(l[u])dfs2(l[u]);
	if(r[u])dfs2(r[u]);
	for(int i=0;i<=m;i++)
	{
		f[u][i]=f[r[u]][i];
		for(int j=0;j<=i-w1[u];j++)
		f[u][i]=max(f[u][i],f[l[u]][j]+f[r[u]][i-j-w1[u]]+v1[u]);
	}
}
int main()
{
	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",vv+i);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",d+i);
		if(d[i])g[d[i]].push_back(i);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)
	{
		if(sd[d[i]]==sd[i])continue;
		g1[sd[d[i]]].push_back(sd[i]);
		rd[sd[i]]++;
	}
	for(int i=1;i<=cnt;i++)if(!rd[i])g1[0].push_back(i);
	dfs1(0,0);
	dfs2(0);
	printf("%d\n",f[0][m]);
	return 0;
}
2023/8/16 14:38
加载中...