50 pts 求调(有些点输出0)
查看原帖
50 pts 求调(有些点输出0)
936078
SinCircle楼主2023/11/1 18:31

得分情况

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e2 + 5;
const int MAXTOT = 5e2 + 5;
const int INF = (int)INFINITY/2-1;
int n,tot,w[MAXN],v[MAXN],d[MAXN],W[MAXN],V[MAXN],dfn[MAXN],low[MAXN],col[MAXN],stk[MAXN],dp[MAXN][MAXTOT],hasfa[MAXN];
void getmax(int &a,const int &b){if(a<b)a=b;}
void getmin(int &a,const int &b){if(a>b)a=b;}
vector<int>e[MAXN];
void tarjan(int u){
	dfn[u]=low[u]=++*dfn;
	stk[++*stk]=u;
	for(int v:e[u]){
		if(!dfn[v]){
			tarjan(v);
			getmin(low[u],low[v]);
		}else getmin(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		int tp;
		++*col;
		do{
			tp=stk[(*stk)--];
			W[*col]+=w[tp];
			V[*col]+=v[tp];
			col[tp]=*col;
		}while(tp!=u);
	}
}
void dfs_ans(int u){
	for(int v:e[u]){
		dfs_ans(v);
		for(int i=tot;i>=W[v];i--){
			for(int j=0;j+W[v]<=i;j++){
				getmax(dp[u][i],dp[u][i-j-W[v]]+dp[v][j]+V[v]);
			}
		}
	}
}
signed main(){
	cin>>n>>tot;
	*col=n;
	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[i],e[d[i]].emplace_back(i);
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++){
		if(d[i]&&col[d[i]]!=col[i]){
			e[col[d[i]]].emplace_back(col[i]);
			hasfa[col[i]]=1;
		}
	}
	++*col;
	for(int i=n+1;i<*col;i++)if(!hasfa[i])e[*col].emplace_back(i);
	dfs_ans(*col);
	cout<<dp[*col][tot];
	return 0;
}
2023/11/1 18:31
加载中...