60分,不知道哪里错了
查看原帖
60分,不知道哪里错了
285617
黑影洞人楼主2022/3/20 22:28
#include<cstdio>
#include<algorithm>
#define N 2245141
using namespace std;
int head[N],to[N],nxt[N],flg,vis[N],vis2[N],vis3[N],sp[N],s1,s2,bi,n,tot;
long long p[N],ans,dp[N][4];
void add(int u,int v){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
void mark(int x){
	sp[x]=1;
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(!sp[y])mark(y);
	}
}
void find(int x,int fa){
	if(flg)return;
	vis[x]=1;
	//printf("%lld\n",x);
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(!vis[y])find(y,x);
		else if(y!=fa){
			s1=x,s2=y,bi=i;
			flg=1;
			return;
		}
	}
//	vis[x]=0;
}
void dfs(int x,int cc){
	dp[x][0+cc]=0;
	dp[x][1+cc]=p[x];
	if(cc==0)vis2[x]=1;
	else vis3[x]=1;
//	printf("%lld:%lld\n",x,cc);
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		int v=(cc==0)?vis2[y]:vis3[y];
		if(!v&&(i^1)!=bi){
			dfs(y,cc); 
			dp[x][0+cc]+=max(dp[y][0+cc],dp[y][1+cc]);
			dp[x][1+cc]+=dp[y][0+cc];
		}
	}
//	vis2[x]=0;
//	vis3[x]=0;
} 
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%lld%d",&p[i],&x);
		add(i,x);add(x,i);
	}
	for(int i=1;i<=n;i++){
		if(sp[i])continue;
		mark(i);
		flg=0;
		find(i,0);
		dfs(s1,0);
		dfs(s2,2);
		ans+=max(dp[s1][0],dp[s2][2]);
		//printf("%lld %lld\n",dp[s1][0],dp[s2][2]);
	//	printf("%lld\n",ans);
	}
	printf("%lld",ans);
	return 0;
}


2022/3/20 22:28
加载中...