比赛 EYOI与SBOI开学欢乐赛11th 评测结果 AAAAAAAAAA
题目名称 骑士 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.702 s
代码语言 C++ 内存使用 14.88 MiB
提交时间 2022-10-14 21:19:18
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000000+10;
struct sdf{
	int to,next;
}eg[2*N];
int head[N],ne=1;
int n;
ll w[N];
void add(int x,int y){
	eg[++ne]={y,head[x]};
	head[x]=ne;return ;
}
int vis[N]={0},st[N],tp=0;
int h[N],cnt=0;
void dfs(int pt,int lst){
	st[++tp]=pt;vis[pt]=1;
	for (int i=head[pt];i!=0;i=eg[i].next){
		int v=eg[i].to;
		if (vis[v]==2||i==(lst^1))continue;
		if (vis[v]==0)dfs(v,i);
		if (vis[v]==1){
			h[++cnt]=i;
			while(st[tp]!=v){
				vis[st[tp]]=2;tp--;
			}
			vis[v]=2;tp--;
		}
	}
	vis[pt]=2;tp--;
	return ;
}
int p;
ll f[N][2],g[N][2];
void dp(int pt,int lst){
	f[pt][0]=0;f[pt][1]=w[pt];
	for (int i=head[pt];i!=0;i=eg[i].next){
		int v=eg[i].to;
		if (i==(lst^1)||i==p||i==(p^1))continue;
		dp(v,i);
		f[pt][0]+=max(f[v][0],f[v][1]);
		f[pt][1]+=f[v][0];
	}
	return ;
}
int main(){
	freopen ("bzoj_1040.in","r",stdin);
	freopen ("bzoj_1040.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		int x;scanf("%lld%d",&w[i],&x);
		add(x,i);add(i,x);
	}
	for (int i=1;i<=n;i++){
		if (!vis[i])dfs(i,0);
	}
	ll ans=0;
	for (int i=1;i<=cnt;i++){
		ll now=0;int s=eg[h[i]].to,t=eg[h[i]^1].to;p=h[i];
		dp(s,0);
		now=max(now,f[s][0]);
		dp(t,0);
		now=max(now,f[t][0]);
		ans+=now;
	}
	printf("%lld\n",ans);
	return 0;
}