50pts求调
查看原帖
50pts求调
1114211
leeon666楼主2024/10/3 17:56
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1E6+1;

int n,cnt,h[N],w[N],r1,r2;
bool vis[N];
ll ans,f[N][2];

struct Edge{
	int to,ne;
}e[N];

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

void findCir(int x,int rt){
	vis[x]=1;
	for(int i=h[x];i;i=e[i].ne){
		int v=e[i].to;
		if(v==rt){
			r1=x;
			r2=v;
			return;
		}
		if(vis[v]) continue;
		findCir(v,rt);
	}
}

void dfs(int x,int rt){
	f[x][0]=0;
	f[x][1]=w[x];
	for(int i=h[x];i;i=e[i].ne){
		int v=e[i].to;
		if(v==rt) continue;
		dfs(v,rt);
		f[x][0]+=max(f[v][1],f[v][0]);
		f[x][1]+=f[v][0];
	}
}

int  main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>w[i]>>x;
		add(x,i);
	}
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		r1=r2=0;
		findCir(i,i);
		if(r1){
			memset(f, 0, sizeof(f));
			dfs(r2,r2);
			ans+=max(f[r2][0],f[r2][1]);
		}
	}
	cout<<ans;
	return 0;
}




2024/10/3 17:56
加载中...