【置换群】poj3270 Cow Sorting

并不应该叫置换群……只是用到了置换而已,并没有群。

题解看这个吧,我就不写了:http://www.cnblogs.com/kuangbin/archive/2012/09/03/2669013.html

证明的话可以自己手撸几组数据模拟一下,比较容易。

复杂度O(n)。

算是个经典题吧?

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define INF 2147483647
vector<int>vs[10010];
struct data{
	int p,v;
}t[10010];
bool cmp(const data &a,const data &b){
	return a.v<b.v;
}
int n,e,ma[10010],minn=INF,ans,t1,t2,minx;
bool vis[10010];
int a[10010];
void dfs(int U){
	vis[U]=1;
	minx=min(minx,ma[U]);
	if(!vis[a[U]]){
		dfs(a[U]);
	}
	t1+=(minx+ma[U]);
	t2+=(minn+ma[U]);
}
int main(){
//	freopen("poj3270.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&t[i].v);
		t[i].p=i;
		minn=min(t[i].v,minn);
	}
	sort(t+1,t+n+1,cmp);
	for(int i=1;i<=n;++i){
		if(t[i].v!=t[i-1].v){
			++e;
		}
		a[e]=t[i].p;
		ma[e]=t[i].v;
	}
	for(int i=1;i<=n;++i){
		if(!vis[a[i]]){
			t1=t2=0;
			minx=INF;
			dfs(a[i]);
			t1-=(minx+minx);
			t2+=(minx+minn);
			ans+=min(t1,t2);
		}
	}
	printf("%d
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/6671394.html