看题解改了很久,还是错的
50分,WA:#1,#2,#5,#9,#10
#include<bits/stdc++.h>
using namespace std;
int n,s,t,size;
long long int ans;
int p[1000005];
long long int f[1000005][2],g[1000005][2];
int head[1000005],nxt[2000005],to[2000005],tot,E;
bool vis[1000005];
bool vis1[1000005];
bool vis2[1000005];
bool used[100005];
void add(int u,int v){
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void fg(int x){
used[x]=1;
for(int i=head[x];i;i=nxt[i])
if(!used[to[i]])fg(to[i]);
}
void fin(int x,int fa){
if(E)return;
vis[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(!vis[to[i]])fin(to[i],x);
else if(to[i]!=fa){
s=x;
t=to[i];
E=i;
return;
}
}
}
void dp1(int x){
vis1[x]=1;
f[x][1]=p[x];
f[x][0]=0;
for(int i=head[x];i;i=nxt[i]){
if(!vis1[to[i]]&&(i^1)!=E){
dp1(to[i]);
f[x][0]+=max(f[to[i]][0],f[to[i]][1]);
f[x][1]+=f[to[i]][0];
}
}
}
void dp2(int x){
vis2[x]=1;
g[x][1]=p[x];
g[x][0]=0;
for(int i=head[x];i;i=nxt[i]){
if(!vis2[to[i]]&&(i^1)!=E){
dp2(to[i]);
g[x][0]+=max(g[to[i]][0],g[to[i]][1]);
g[x][1]+=g[to[i]][0];
}
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
int v;
cin>>p[i]>>v;
add(i,v);
add(v,i);
}
for(int i=1;i<=n;i++){
if(used[i])continue;
fg(i);E=0;
fin(i,0);
dp1(s);
dp2(t);
ans+=max(f[s][0],g[t][0]);
}
printf("%lld",ans);
return 0;
}