和06的书架比,这可是数学的多。
必须使用置换群+离散。
搜一个就是的了。
#include<bits/stdc++.h>
using namespace std;
int a[2001]={0};
int use[2001]={0};
int n,minsum,ji,ou;
int odd(int x){
return x%2;
}
void dfs(int k,int ki,int od,int even){
use[k]=0;
if(use[a[k]]==0){
if(ki==1)
return;
minsum=minsum+ki-1;
if(od&&even)
return;
if(od){
ji++;
}
else{
ou++;
}
}
else{
dfs(a[k],ki+1,od or odd(a[k]),even or(not odd(a[k])));
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
ji=0;
ou=0;
minsum=0;
memset(use,1,sizeof(use));
for(int i=1;i<=n;i++){
if(use[i]){
dfs(i,1,odd(i),1-odd(i));
}
}
if(ji>ou){
minsum=minsum+ji*2;
}
else{
minsum=minsum+ou*2;
}
printf("%d\n",minsum);
}