10pts AC on #2求助
查看原帖
10pts AC on #2求助
1164775
Jadonyzx楼主2024/4/14 15:06
#include<bits/stdc++.h>
#define int long long
#define maxn 1010
#define maxm 1010
using namespace std;
int n,m,d,top,dfn[maxn],low[maxn];
int w[maxn],v[maxn],stk[maxn];
int W[maxn],V[maxn],SSC[maxn];
int dp[maxn][maxm],indgr[maxn];
int dfcnt,ssccnt;
bool instk[maxn],gogo[maxn][maxn];
vector<int>edge[maxn],ssc[maxn],Edge[maxn];
void Tarjan(int u){
	dfn[u]=low[u]=++dfcnt;
	stk[++top]=u;instk[u]=1;
	for(int i=0;i<edge[u].size();++i){
		int vv=edge[u][i];
		if(!dfn[vv]){
			Tarjan(vv);
			low[u]=min(low[vv],low[u]);
		}
		else low[u]=min(low[u],dfn[vv]);
	}
	if(dfn[u]==low[u]){
		int tp;
		++ssccnt;
		do{
			tp=stk[top--];
			SSC[tp]=ssccnt;
			instk[tp]=0;
			ssc[ssccnt].push_back(tp);
		}while(tp!=u);
	}
	return;
}
void dfs(int rt){
	for(int i=W[rt];i<=m;++i)dp[rt][i]=V[rt];
	for(int i=0;i<Edge[rt].size();++i){
		int to=Edge[rt][i];
		dfs(to);
		for(int j=m;j>=0;--j){
			for(int k=0;k<=j;++k){
				dp[rt][j]=max(dp[rt][j],dp[rt][k]+dp[to][j-k]);
			}
		}
	}
	return;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i)cin>>w[i];
	for(int i=1;i<=n;++i)cin>>v[i];
	for(int i=1;i<=n;++i){
		cin>>d;
		edge[d].push_back(i);
	}
//	for(int i=0;i<edge[0].size();++i)cout<<edge[0][i]<<' ';
	for(int i=0;i<=n;++i)if(!dfn[i])Tarjan(i);
	for(int i=1;i<=ssccnt;++i){
		for(int j=0;j<ssc[i].size();++j){
			W[i]+=w[ssc[i][j]];
			V[i]+=v[ssc[i][j]];
		}
	}
//	for(int i=1;i<=ssccnt;++i)cout<<W[i]<<' '<<V[i]<<'\n';
	for(int i=0;i<=n;++i){
		for(int j=0;j<edge[i].size();++j){
			int to=edge[i][j];
			if(SSC[i]!=SSC[to])
				Edge[SSC[i]].push_back(SSC[to]),indgr[SSC[to]]++;
		}
	}
	for(int i=1;i<=ssccnt;++i)if(SSC[0]!=i && indgr[i]==0)Edge[SSC[0]].push_back(i);
	dfs(SSC[0]);
//	for(int i=0;i<Edge[SSC[0]].size();++i)cout<<Edge[SSC[0]][i]<<' ';
//	for(int i=1;i<=ssccnt;++i)cout<<V[i]<<' ';
//	for(int i=1;i<=ssccnt;++i){
//		for(int j=1;j<=m;++j)cout<<dp[i][j]<<' ';
//		cout<<'\n';
//	}
	cout<<dp[SSC[0]][m];
	return 0;
}
2024/4/14 15:06
加载中...