全wa悬关
查看原帖
全wa悬关
1087173
guer_loser_lcz楼主2024/4/27 17:46
#include<bits/stdc++.h>
using namespace std;
int n,af[1000100],kn[1000100],in[1000100],r,l,tot[1000100][2],ans;
vector<int> e[1000100];
bool vis[1000100],vis1[1000100];
void top(){
	queue<int> q;
	for(int i=1;i<=n;i++)if(in[i]==1)q.push(i);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(auto y:e[x]){
			if(--in[y]==1)q.push(y);
		}
	}
}
void find(int i){
	for(int i=1;i<=n;i++){
		if(in[i]<=1)continue;
		bool lcy=0;
		for(auto j:e[i]){
			if(in[j]>1){
				lcy=1;
				r=i;
				l=j;
			}
		}
		if(lcy)break;
	}
	return;
}
void dp(int x){
	vis[x]=1;
	vis1[x]=101010;
	tot[x][0]=0;
	tot[x][1]=kn[x];
	for(auto y:e[x]){
		if(vis1[y])continue;
		dp(y);
		tot[x][0]+=max(tot[y][1],tot[y][0]);
		tot[x][1]+=tot[y][0];
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d %d",&kn[i],&af[i]);
		e[i].push_back(af[i]);
		e[af[i]].push_back(i);
		in[af[i]]++;
		in[i]++;
	}
	top();
	for(int i=1;i<=n;i++){
		if(vis[i]==1||in[i]<=1)continue;
		find(i);
		memset(tot,0,sizeof tot);
		memset(vis1,0,sizeof vis1);
		dp(r);
		memset(tot,0,sizeof tot);
		memset(vis1,0,sizeof vis1);
		vis1[r]=1;
		dp(l);
		ans+=max(tot[r][0],tot[l][0]);
	}
	cout<<ans;
	return 0;
} 

2024/4/27 17:46
加载中...