#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<list>
#include<map>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
long long n;
long long f[2000010],v[2000010];
long long head[2000010],cnt=1;
struct edg{
long long next,to;
}edge[4000005];
void add_edge(long long u,long long v)
{
edge[++cnt].next=head[u];
edge[cnt].to=v;
head[u]=cnt;
}
long long dp[3][2000010][2],vis[2][2000010],j,del[2000010],m;
void DFS(long long now,long long type)
{
vis[type][now]=1;
for(long long i=head[now];;i=edge[i].next)
{
if(!i) break;
if(i==del[j]||i==(del[j]^1)) continue;
if(vis[type][edge[i].to]) continue;
DFS(edge[i].to,type);
dp[type][now][0]+=max(dp[type][edge[i].to][0],dp[type][edge[i].to][1]);
dp[type][now][1]+=dp[type][edge[i].to][0];
}
dp[type][now][1]+=v[now];
}
long long lj,jc=0;
long long juruo[2000010];
long long finds(long long x)
{
if(juruo[x]==x) return x;
return juruo[x]=finds(juruo[x]);
}
inline void hb(long long x,long long y)
{
juruo[finds(x)]=finds(y);
}
bool cmp(long long a,long long b)
{
return edge[a].to<edge[b].to;
}
signed main()
{
// freopen("az.txt","r",stdin);
scanf("%lld",&n);
for(long long i=1;i<=n;i++) juruo[i]=i;
for(long long i=1;i<=n;i++)
{
scanf("%lld%lld",&v[i],&f[i]);
add_edge(i,f[i]);
add_edge(f[i],i);
if(finds(i)!=finds(f[i])) hb(i,f[i]); else del[++m]=cnt;
}
for(long long i=1;i<=n;i++)
if(!vis[1][i])
{
++j;
swap(jc,v[edge[del[j]^1].to]);
DFS(i,0);
swap(jc,v[edge[del[j]^1].to]);
swap(jc,v[edge[del[j]].to]);
DFS(i,1);
swap(jc,v[edge[del[j]].to]);
lj+=max(max(dp[0][i][0],dp[0][i][1]),max(dp[1][i][0],dp[1][i][1]));
}
printf("%lld",lj);
return 0;
}
前6个点+第9个(没法下数据真的不好调)是思路错了还是有什么细节舅舅孩子