AcWing 1224. 交换瓶子
tags: 置换群 图论
置换环
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
3 | 1 | 2 | 5 | 4 |
每一个点都有属于他的环。
交换操作:某点的出度,会指向和他交换的点的下标
- 与环内的点交换,必定会裂开。一个无序的环内交换,肯定会让某个点变成有序
- 与环外的点交换,必定会融合。因为两个都是无序的,肯定会变成更无序
所以最少要交换的次数,就是每次都让环内的点交换
遍历得出环的数量
for (int j = i; !st[j]; j = b[j])
b[b[j]]
某一点下标对应的值,当成另外一个的下标
b[j]
某一点下标对应的值
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 10000 + 10;
int n, cnt;
int b[maxn];
bool st[maxn];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++) scanf("%d", &b[i]);
for (int i = 1; i <= n; i ++)
if (!st[i])
{
cnt ++;
for (int j = i; !st[j]; j = b[j])
{
st[j] = true;
}
}
cout << n - cnt << endl;
return 0;
}
有什么问题可以加qq:1281372141进行交流