这份代码在#2和#6上WA,在#4上MLE
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+10;
int n,a[N],f[N][2];
int idx,head[N];
struct edge{
int v,next;
}e[N<<1];
bool vis[N];
int st,ed,cut;
void add_edge(int u,int v){
e[idx]={v,head[u]};head[u]=idx;idx++;
}
void findc(int u,int fa){
vis[u]=true;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==fa) continue;
if(vis[v]){
st=u;ed=v;cut=i;
continue;
}
findc(v,u);
}
}
void dfs(int u,int fa){
f[u][0]=0;f[u][1]=a[u];
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==fa) continue;
if(i==cut||(i^1)==cut) continue;
dfs(v,u);
f[u][1]+=f[v][0];
f[u][0]+=max(f[v][0],f[v][1]);
}
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
int fa;cin>>a[i]>>fa;
add_edge(i,fa);add_edge(fa,i);
}
int ans=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
st=ed=cut=0;
findc(i,0);
dfs(st,0);int ans1=f[st][0];
dfs(ed,0);int ans2=f[ed][0];
ans+=max(ans1,ans2);
}
}
cout<<ans<<'\n';
return 0;
}