#include <bits/stdc++.h>
using namespace std;
int n,l,k,rt,fa[1000005],tmp;
long long dp[1000005][2],ans1,ans2,ans;
int r[1000005];
bool vis[1000005];
vector<int> sons[1000005];
int find_root(int p){
while(1){
if(vis[p])return p;
vis[p]=1;
p=fa[p];
}
}
void dfs(int p){
vis[p]=1;
dp[p][0]=0;
dp[p][1]=r[p];
for(int i=0;i<sons[p].size();i++){
dfs(sons[p][i]);
dp[p][0]+=max(dp[sons[p][i]][0],dp[sons[p][i]][1]);
dp[p][1]+=dp[sons[p][i]][0];
}
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&r[i],&fa[i]);
sons[fa[i]].push_back(i);
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
vis[i]=1;
rt=find_root(i);
tmp=fa[rt];
fa[rt]=0;
for(vector<int>::iterator it=sons[tmp].begin();it!=sons[tmp].end();++it){
if(*it==rt){
sons[tmp].erase(it);
break;
}
}
dfs(rt);
ans1=dp[rt][0];
fa[rt]=tmp;
sons[tmp].push_back(rt);
rt=fa[rt];
tmp=fa[rt];
fa[rt]=0;
for(vector<int>::iterator it=sons[tmp].begin();it!=sons[tmp].end();++it){
if(*it==rt){
sons[tmp].erase(it);
break;
}
}
dfs(rt);
ans2=dp[rt][0];
ans+=max(ans1,ans2);
}
printf("%lld",ans);
return 0;
}
找不到40pt的错误