POJ 3270 Cow Sorting(置换群问题)

//离散数学中的置换群问题,找循环节个数。两种情况,1:找循环节中最小值,s-Min+(len-1)*Min。2:用数列中的最小值s+Min+(len+1)*MIN。取最小和
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+10;
const int inf=1<<29;
int vis[maxm];
struct node
{
    int w,id;
    bool operator<(const node &s)const
    {
        return w<s.w;
    }
}t[maxm];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        int MIN=inf;
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&t[i].w);
            MIN=min(MIN,t[i].w);
            t[i].id=i;
        }
        sort(t+1,t+n+1);
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                int Min=t[i].w,now=t[i].id,len=1,s=t[i].w;
                while(now!=i)
                {
                    vis[now]=1;
                    len++;
                    s+=t[now].w;
                    Min=min(Min,t[now].w);
                    now=t[now].id;
                }
                 sum+=min(s-Min+(len-1)*Min,s+Min+(len+1)*MIN);
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(POJ 3270 Cow Sorting(置换群问题))