cf edu round49(div2) D. Mouse Hunt
阿新 • • 發佈:2019-01-14
這個程式碼很巧妙的解決了判環問題,利用每個出度只有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\n",ans); }