PKU 1674 Sorting by Swapping

一开始打算用排序,然后计算当中的交换次数,发现有点难.看了discuss才知道.算法很简单,但是给不出严密的证明.

找出序列中所有的"环",这里的"环"就是指它们互相交换之后能成为标准序列的最小集合
交换的总次数 = 元素个数 - 环数

很久没做题了,写写报告...

#include<stdio.h> int a[10002]; bool b[10002]; int main() { int n; scanf("%d",&n); while(n--) { int m; scanf("%d",&m); int i,j; int sum=0; for(i=1;i<=m;i++) { scanf("%d",&a[i]); //读入数据 b[i]=0; //初始化为未访问 } for(i=1;i<=m;i++) { if(b[i]==0) //如果此结点未被访问 { b[i]=1; //标记为已被访问 j=i; while(a[j]!=i) //开始搜索,直到搜索的路径构成环 { j=a[j]; b[j]=1; } b[j]=1; sum++; } } printf("%d/n",m-sum); } return 0; }

你可能感兴趣的:(PKU 1674 Sorting by Swapping)