当前位置 博文首页 > 文章内容

    AcWing 1224. 交换瓶子

    作者: 栏目:未分类 时间:2020-08-14 17:58:39

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    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;
        
    }