zoukankan      html  css  js  c++  java
  • pat1067 在离散数学中置换群思想上可用并查集和递归两种方法求解问题

    1.递归求解  注:叙述时 节点其实就是数字0-N-1 

    !!!最好用一个数组记录0-N-1每个数字的位置

    !!!递归计算一个置换群内部的节点数 分为两种情况 累加M,M即是一个置换群所有数字在正确位置上所需要的swap 次数。这句话

    需要详细解释下,如果这个置换群里面有0则M=置换群节点数量-1(找一个测试样例,自行模拟);如果这个置换群里面没有0,则M=置换群节点数量+1

    !!!vis记录是否该节点已经被放在正确的位置

    !!!剩下就没什么可说的了 参考了https://www.cnblogs.com/biaobiaoqi/p/3357228.html

    #include <iostream>
    using namespace std;
    int arr[100000+5];
    bool vis[100000+5]={0};
    bool zero;
    int M;//循环链节点个数
    int cnt=0;//交换次数
    void dfs(int v){
    if(v!=0&&vis[v]){
    return;
    }
    if (v==0)
    zero=1;
    vis[v]=1;
    M++;
    //cout<<M<<"***"<<zero<<endl;
    dfs(arr[v]);
    }
    int main(){
    int N,temp,ans=0,num=0;
    scanf("%d",&N);
    for (int i=0;i<N;i++){
    scanf("%d",&temp);
    arr[temp]=i;
    }
    for (int i=0;i<N;i++){
    zero=0;
    M=0;
    if (i!=0&&!vis[i]&&arr[i]!=i){
    dfs(i);
    if (zero==1){
    cnt+=M-1;
    }
    else{
    cnt+=M+1;
    }
    }
    }
    cout<<cnt;
    }

    2.并查集 先欠着 后续再说 (其实能解决是解决 ,感觉递归计算更直观)

    认准了,就去做,不跟风,不动摇
  • 相关阅读:
    Count the Colors---zoj1610线段树
    统计难题---hdu1251字典树模板
    Mayor's posters---poj2528线段树、离散化
    I Hate It---hdu1754线段树
    敌兵布阵---hud1166(线段树或者树状数组模板)
    A Simple Problem with Integers---poj3468线段树
    STL的Vector介绍
    STL的Deque介绍
    索尼高清影视技术学院参观观后感
    RTSP协议学习笔记
  • 原文地址:https://www.cnblogs.com/mdz-great-world/p/9451252.html
Copyright © 2011-2022 走看看