记录
#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;
}