比赛 中秋节快乐! 评测结果 AAAAAAAAAA
题目名称 骑士 最终得分 100
用户昵称 wdsjl 运行时间 0.842 s
代码语言 C++ 内存使用 14.42 MiB
提交时间 2024-09-17 10:40:56
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 1000010;

int va[N],a,b;
long long f[N][3];

struct node{
	int to,ne,v;
}e[N*2];

int h[N],vis[N],n,s,tot,x1,x2,E;

void add(int x,int y){
	e[tot].to=y,e[tot].ne=h[x],h[x]=tot++;
	return ;
}

void huan(int u,int fa){
	vis[u]=1;
	for(int i=h[u];~i;i=e[i].ne){
		if((i^1)==fa)continue;
		if(vis[e[i].to]){
			x1=u,x2=e[i].to;
			E=i;
			continue;
		}
		huan(e[i].to,i);
	}
}

void dfs(int u,int fa){
	f[u][0]=0;
	f[u][1]=va[u];
	for(int i=h[u];~i;i=e[i].ne){
		if((i^1)==fa)continue;
		if(i==E||(i^1)==E)continue;
		dfs(e[i].to,i);
		f[u][0]+=max(f[e[i].to][0],f[e[i].to][1]);
		f[u][1]+=f[e[i].to][0];
	}
	return ;
}

int main(){
	freopen("bzoj_1040.in","r",stdin);
	freopen("bzoj_1040.out","w",stdout);
	memset(h,-1,sizeof(h));
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a,&b),add(i,b),add(b,i),va[i]=a;
	}
	long long res=0;
	for(int i=1;i<=n;i++){
		if(vis[i])continue;
		huan(i,-2);
		dfs(x1,-1);
		long long cnt=f[x1][0];
		dfs(x2,-1);
		cnt=max(cnt,f[x2][0]);
		res+=cnt;
	}
	printf("%lld",res);
	return 0;
}