Solution
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=1000010;
int n;
struct node{
int to,nxt;
}e[N<<1];int head[N],cnt;
int val[N];
bool vis[N];
LL f[N],g[N];
int s,t,p;
void add(int f,int t){
e[cnt]=(node){t,head[f]};
head[f]=cnt++;
}
void dfs(int u,int fa){
vis[u]=1;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(v==fa) continue;
if(!vis[v]) dfs(v,u);
else{
s=u,t=v;
p=i;
}
}
}
void DP(int u,int fa){
f[u]=val[u];g[u]=0;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(v==fa) continue;
if(i==p||i==(p^1)) continue;
DP(v,u);
f[u]+=g[v];
g[u]+=max(g[v],f[v]);
}
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d",&n);
int c,x;
for(int i=1;i<=n;++i){
scanf("%d%d",&c,&x);
add(i,x);add(x,i);
val[i]=c;
}
LL tmp=0,ans=0;
for(int i=1;i<=n;++i){
if(vis[i]) continue;
dfs(i,-1);
DP(s,-1);
tmp=g[s];
DP(t,-1);
ans+=max(tmp,g[t]);
}
cout<<ans;
return 0;
}