这个代码很巧妙的解决了判环问题,利用每个出度只有1的特殊条件,cnt是一个类似时间戳的东西
,来判断当前节点开始的环是否被访问过,如果没被访问才能加到答案中。
#include<bits/stdc++.h> using namespace std; int n; int c[200010]; int a[200010]; int vis[200010]; int ans; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int cnt=0; for(int i=1;i<=n;i++) { if(!vis[i]) { cnt++; int x=i; vis[x]=cnt; int rt=a[x]; while(!vis[rt]) { vis[rt]=cnt; rt=a[rt]; } if(vis[rt]!=cnt) continue; x=a[rt]; int now=c[rt]; while(rt!=x) { now=min(c[x],now); x=a[x]; } ans+=now; } } printf("%d ",ans); }