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.并查集 先欠着 后续再说 (其实能解决是解决 ,感觉递归计算更直观)

    认准了,就去做,不跟风,不动摇
  • 相关阅读:
    浅谈MVVM模式和MVP模式——Vue.js向
    浅谈JavaScript中的null和undefined
    js的单线程和异步
    字符串替换replace方法
    数组的长度、数组元素的添加和删除
    去掉数组中的空元素
    创建数组方法、数组元素的读和写
    Android中H5和Native交互的两种方式
    请求抓取工具
    css层叠规则(层叠样式表)
  • 原文地址:https://www.cnblogs.com/mdz-great-world/p/9451252.html
Copyright © 2011-2022 走看看