WA20求助
查看原帖
WA20求助
556362
qwq___qaq楼主2022/3/8 20:23
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+5;
int n,l,r,k,o,ans,a[maxn],dp[maxn][2];
struct edge{
	int to,id;
};
vector<edge> G[maxn];
bool vis[maxn],v[maxn],f[maxn];
void init(int u,int lst,int x){
	if(v[u]){
		l=u;
		r=lst;
		k=x;
		return;
	}
	v[u]=1;
	for(int i=0,len=G[u].size();i<len;++i){
		int r=G[u][i].to,w=G[u][i].id;
		init(r,u,w);
	}
}
void dfs(int u){
	vis[u]=1;
	dp[u][1]=a[u];
	dp[u][0]=0;
	for(int i=0,len=G[u].size();i<len;++i){
		int r=G[u][i].to,w=G[u][i].id;
		if(vis[r]||f[w])
			continue;
		dfs(r);
		dp[u][1]+=dp[r][0];
		dp[u][0]+=max(dp[r][0],dp[r][1]);
	}
}
signed main(){
	scanf("%lld",&n);
	for(int i=1,x;i<=n;++i){
		scanf("%lld%lld",&a[i],&x);
		G[i].push_back(edge({x,i*2-1}));
		G[x].push_back(edge({i,i*2}));
	}
	for(int i=1;i<=n;++i)
		if(!v[i]){
			init(i,0,0);
			if(k%2)
				f[k]=f[k+1]=1;
			else
				f[k]=f[k-1]=1;
			dfs(l);
			o=dp[l][0];
			memset(vis,0,sizeof(vis));
			dfs(r);
			ans+=max(o,dp[r][0]);
		}
	printf("%lld\n",ans);
	return 0;
} 
2022/3/8 20:23
加载中...