交换瓶子
题目描述
核心思路
初始情况分析:
交换1个环中的任意两个结点后的情况分析:
交换不同环中的两个结点的情况分析:
有n个瓶子,那么最终要使得这n个瓶子都是自环。设最初题目输入的瓶子所形成的环的个数是cnt个,那么我们只需要做 n − c n t n-cnt n−cnt次操作,就可以得到n个自环了。
因此,只要求出题目输入的原始瓶子能形成的环的个数cnt,然后用n-cnt就是最少的交换次数了。
问题:如何理解j=a[j]呢?
代码
#include<iostream>
using namespace std;
const int N=10010;
int n;
int a[N];
bool st[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int cnt=0; //原始的环的个数
//求出原始题目输入的瓶子的环的个数
for(int i=1;i<=n;i++)
{
if(!st[i])//如果i这个瓶子还没有被考虑过
{
cnt++;//原始的环的个数+1
for(int j=i;!st[j];j=a[j])//位置j指向a[j]的元素
st[j]=true;
}
}
printf("%d\n",n-cnt);
return 0;
}