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);
}

猜你喜欢

转载自www.cnblogs.com/lishengkangshidatiancai/p/10268567.html
今日推荐