并查集维护环求调
查看原帖
并查集维护环求调
456287
wuxingyuan楼主2022/5/18 01:25

rt

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=(1e6)+5;
int par[maxn];
ll p[maxn];
vector<int>g[maxn];
int find(int x){
	if(x==par[x])return x;
	else return par[x]=find(par[x]);
}
void unit(int x,int y){
	x=find(x);
	y=find(y);
	par[x]=y;
}
ll dp[maxn][2];
void dfs(int u,int fa){
	dp[u][1]=p[u];
	dp[u][0]=0;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(v==fa)continue;
		dfs(v,u);
		dp[u][1]+=dp[v][0];
		dp[u][0]+=max(dp[v][0],dp[v][1]);
	}
}
vector<int>s,t;
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)par[i]=i;
	for(int i=1;i<=n;i++){
		scanf("%lld",&p[i]);
		int u=i,v;
		scanf("%d",&v);
		if(find(u)==find(v)){
			s.push_back(u);
			t.push_back(v);
			continue;
		}
		unit(u,v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	ll ans;
	for(int i=0;i<s.size();i++){
		ll a;
		dfs(s[i],-1);
		a=dp[s[i]][0];
		dfs(t[i],-1);
		a=max(a,dp[t[i]][0]);
		ans+=a;
	}
	printf("%lld",ans);
	return 0;
}
2022/5/18 01:25
加载中...