#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n;
int a[N];
vector<int> edge[N];
int dp[N][2];
bool vis[N];
int l,r;
void dfs(int rt,int fa)
{
vis[rt]=1;
for(auto i:edge[rt])
{
if(i!=fa)
{
if(vis[i])
l=rt,r=i;
else
dfs(i,rt);
}
}
}
void treedp(int rt,int fa)
{
dp[rt][0]=0;
dp[rt][1]=a[rt];
for(auto i:edge[rt])
{
if(i!=fa)
{
if(rt==l and i==r or i==l and rt==r) continue;
treedp(i,rt);
dp[rt][1]+=dp[i][0];
dp[rt][0]+=max(dp[i][0],dp[i][1]);
}
}
}
int ans;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1,x;i<=n;i++)
{
cin>>a[i]>>x;
edge[i].push_back(x);
edge[x].push_back(i);
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
dfs(i,i);
treedp(l,r);
int now=dp[l][0];
treedp(r,l);
ans+=max(now,dp[r][0]);
}
}
// for(int i=1;i<=n;i++) cout<<dp[i][1]<<' '<<dp[i][0]<<'\n';
cout<<ans<<'\n';
return 0;
}
已知是重边导致 WA