求助 50分已去重
查看原帖
求助 50分已去重
1404345
zzx20110203楼主2025/1/16 11:09

记录

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
int a[maxn];
vector<int>ve[maxn];
bool vis[maxn];
bool viss[maxn];
int book[maxn];
int un1,un2;
long long dp1[maxn];
long long dp2[maxn];
int n;
void clcb(){
	for(int i=1;i<=n;i++){
		sort(ve[i].begin(),ve[i].end());
		for(int j=1;j<ve[i].size();j++){
			if(ve[i][j]==ve[i][j-1]){
				ve[i].erase(ve[i].begin()+j);
				book[i]--;
			}
		}
	}
	return ;
}
void pp(){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(book[i]==1){
			q.push(i);
		}
	}
	while(!q.empty()){
		int o=q.front();
		q.pop();
		book[o]--;
		for(int i=0;i<ve[o].size();i++){
			if(vis[ve[o][i]]){
				continue;
			}
			book[ve[o][i]]--;
			if(book[ve[o][i]]==1){
				q.push(ve[o][i]);
			}
		}
		vis[o]=1;
	}
	return ;
}
void dfsr(int op,int fa){
	viss[op]=1;
	for(int i=0;i<ve[op].size();i++){
		if(fa==ve[op][i]){
			continue;
		}
		if(viss[ve[op][i]]){
			un1=op;
			un2=ve[op][i];
			return ;
		}
		dfsr(ve[op][i],op);
	}
	return ;
}
void dfs(int op,int fa){
	dp1[op]=a[op];
	for(int i=0;i<ve[op].size();i++){
		if(fa==ve[op][i]||(op==un1&&un2==ve[op][i])||(op==un2&&un1==ve[op][i])){
			continue;
		}
		dfs(ve[op][i],op);
		dp1[op]+=dp2[ve[op][i]];
		dp2[op]+=max(dp2[ve[op][i]],dp1[ve[op][i]]);
	}
	return ;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int z,op;
		cin>>z>>op;
		a[i]=z;
		ve[i].push_back(op);
		ve[op].push_back(i);
		book[i]++;
		book[op]++;
	}
	clcb();
	pp();
	long long ans=0; 
	for(int i=1;i<=n;i++){
		if(vis[i]||viss[i]){
			continue;
		}
		for(int i=0;i<=maxn-3;i++){
			dp1[i]=0;
			dp2[i]=0;
		}
		long long sum=0;
		un1=-2;
		un2=-2;
		dfsr(i,-2);
		if(un1==-2){
			dfs(i,-1);
			ans+=max(dp1[i],dp2[i]);
		}
		else{
			dfs(un1,-3);
			sum=dp2[un1];
			for(int i=0;i<=maxn-3;i++){
				dp1[i]=0;
				dp2[i]=0;
			}
			dfs(un2,-3);
			ans+=max(sum,dp2[un2]);	
		}
	}
	cout<<ans;
	return 0;
}
2025/1/16 11:09
加载中...