#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n;
int atk[1000010],fa[1000010];
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
vector<pair<int,int> >q;
struct Edge{
int to,nxt;
}edge[2000010];
int head[1000010],tot=0;
void add(int u,int v){
edge[++tot].to=v;
edge[tot].nxt=head[u];
head[u]=tot;
}
long long dp[1000010][2];
void dfs(int x,int fa){
dp[x][0]=0,dp[x][1]=atk[x];
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(y==fa)continue;
dfs(y,x);
dp[x][0]+=max(dp[y][0],dp[y][1]);
dp[x][1]+=dp[y][0];
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++){
int x;
scanf("%d%d",&atk[i],&x);
if(find(i)!=find(x)){
fa[i]=x; //fa[x]=i;
add(i,x);
add(x,i);
}
else q.push_back({i,x});
}
long long ans=0;
for(int i=0;i<q.size();i++){
int x=q[i].first,y=q[i].second;
dfs(x,0);
long long tmp=dp[x][0];
dfs(y,0);
tmp=max(tmp,dp[y][0]);
ans+=tmp;
}
printf("%lld",ans);
return 0;
}
主函数输入时若 fa[i]=x 则能AC,若 fa[x]=i 则不过。为啥啊??