Fork me on GitHub

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;
    
}
posted @ 2020-08-14 17:55  WalterJ726  阅读(95)  评论(0编辑  收藏  举报