1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #define maxn 1000005
5 #define ll long long
6 using namespace std;
7 long long ecnt,head[maxn],n,vis[maxn],f[maxn][3],a[maxn],ans,st,ed,bian;
8 struct edge
9 {
10 long long u,v,next;
11 }E[maxn*2];
12 void add(long long u,long long v)
13 {
14 E[ecnt].u=u;
15 E[ecnt].v=v;
16 E[ecnt].next=head[u];
17 head[u]=ecnt++;
18 }
19 void dfs(long long u,ll dad)
20 {
21 vis[u]=1;
22 for(ll i=head[u];~i;i=E[i].next)
23 {
24 ll v=E[i].v;
25 if(v==dad) continue;
26 if(vis[v])//把环拆成链
27 {
28 st=u;
29 ed=v;
30 bian=i;
31 continue;
32 }
33 dfs(v,u);
34 }
35 }
36 void dp(ll u,ll dad)
37 {
38 f[u][1]=a[u];
39 f[u][0]=0;
40 for(ll i=head[u];~i;i=E[i].next)
41 {
42 if(bian==i||bian==(i^1)) continue;//若是环则跳过
43 ll v=E[i].v;
44 if(v==dad) continue;
45 dp(v,u);
46 f[u][1]+=f[v][0];
47 f[u][0]+=max(f[v][0],f[v][1]);
48 }
49 }
50 int main()
51 {
52 scanf("%d",&n);
53 memset(head,-1,sizeof(head));
54 for(ll i=1;i<=n;++i)
55 {
56 ll t;
57 scanf("%d%d",&a[i],&t);
58 add(t,i);
59 add(i,t);
60 }
61
62 for(ll i=1;i<=n;++i)
63 {
64 if(!vis[i])
65 {
66 dfs(i,0);
67 dp(st,0);
68 ll tmp=f[st][0];
69 dp(ed,0);
70 tmp=max(tmp,f[ed][0]);
71 ans+=tmp;
72 }
73 }
74 printf("%lld",ans);
75 return 0;
76 }
void add(long long u,long long v)
{
E[ecnt].u=u;
E[ecnt].v=v;
E[ecnt].next=head[u];
head[u]=ecnt++;
}