1. 程式人生 > >cf edu round49(div2) D. Mouse Hunt

cf edu round49(div2) D. Mouse Hunt

這個程式碼很巧妙的解決了判環問題,利用每個出度只有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); }