您的位置:首页 > 移动开发

PKU 1674 Sorting by Swapping

2010-01-27 01:07 537 查看
一开始打算用排序,然后计算当中的交换次数,发现有点难.看了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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: