#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int tot,r1,r2,a[N],h[N],f[N][2];
bool vis[N];
struct edge{
int v,next;
}e[N];
void add(int u,int v){
tot++;
e[tot]={v,h[u]};
h[u]=tot;
}
void find(int u,int root){
vis[u]=true;
for(int i=h[u];i;i=e[i].next){
int v=e[i].v;
if(v==root){
r1=u;
r2=v;
return;
}
if(vis[v])
continue;
find(v,root);
}
}
void dfs(int u,int root){
f[u][0]=0;
f[u][1]=a[u];
for(int i=h[u];i;i=e[i].next){
int v=e[i].v;
if(v==root)
continue;
dfs(v,root);
f[u][0]+=max(f[v][0],f[v][1]);
f[u][1]+=f[v][0];
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,v;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>v;
add(v,i);
}
int ans=0;
for(int i=1;i<=n;i++){
if(vis[i])
continue;
r1=r2=0;
find(i,i);
if(!r1)
continue;
dfs(r1,r1);
int maxv=f[r1][0];
dfs(r2,r2);
maxv=max(maxv,f[r2][0]);
ans+=maxv;
}
cout<<ans<<endl;
return 0;
}
如果不加
r1=r2=0;
和
if(!r1)
continue;
就会 WA30。
但蒟蒻认为对于每一个连通块,一定会找到环,r1 和 r2 应该不会等于零。求大佬指点。