C++利用map实现并查集

 更新时间:2020年07月05日 14:33:12   作者:y1054765649  
这篇文章主要为大家详细介绍了C++利用map实现并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

并查集(Union-Find)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 并查集存在两个操作(1.Union 联合 2.finddeputy 查找代表结点) 和一个需要解答的问题( issameset 是否 在一个集合中,或者说是否有同一个代表结点)。

利用map实现主要通过两个map的对象 ,一个map<data,data>类型的fathermap,关键字为子结点,值为其父结点(父结点不一定就是代表结点),当我们需要查找两个两个元素是否在一个集合中时,只需一直向上找(函数finddupty),在找的过程中,会压缩路径,把沿途经过的结点直接挂在其代表结点下,看是否有共同的代表结点;

一个map<data,int>类型的sizemap,key为结点,value为其子结点的个数(这个个数只对代表结点有效,子结点无效),主要用处是在合并(union)时将子结点较少的代表结点挂在子结点代表较多的代表结点下,且sizemap中父结点对应的value要加上子结点较少的代表的结点个数。

代码如下:

#include<map>
#include<list>
#include<iostream>
using namespace std;
 
template<typename data>
class Unionfindset{
public:
 void makesets(list<data> nodes)
 {
  fathermap.clear();
  sizemap.clear();
  for(auto node:nodes)
  {
   fathermap[node]=node;
   sizemap[node]=1;   
  }
 }
 
//寻找代表结点,且路径压缩
 data findduputy(data node)
 {
  data father=fathermap[node];
  if(father!=node)
  {
   return findduputy(father);
  }
  fathermap[node]=father;
  return father;
 } 
 
 void Union(data a ,data b)
 {
  data ahead=findduputy(a);
  data bhead=findduputy(b);
  if(ahead!=bhead)
  {
   data asize=sizemap[a];
   data bsize=sizemap[b];
   if(asize<bsize)
   {
    fathermap[a]=b;
    sizemap[b]=bsize+asize;
   }
   else 
   {
    fathermap[b]=a;
    sizemap[a]=bsize+asize;
   }  
  }  
 } 
 
 bool issameset(data a,data b)
 {
  return findduputy(a)==findduputy(b);
 }
 
private:
 map<data,data> fathermap;
 map<data,data> sizemap;
};

谢谢阅读,欢迎指出错误!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++ List链表的介绍和使用

    C++ List链表的介绍和使用

    list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代,这篇文章主要介绍了C++ List链表的介绍和使用,需要的朋友可以参考下
    2023-03-03
  • C++ 两个vector对象拼接方式

    C++ 两个vector对象拼接方式

    这篇文章主要介绍了C++ 两个vector对象拼接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Dijkstra算法与Prim算法的异同案例详解

    Dijkstra算法与Prim算法的异同案例详解

    这篇文章主要介绍了Dijkstra算法与Prim算法的异同案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • c++ STL常用遍历算法

    c++ STL常用遍历算法

    这篇文章主要介绍了c++ STL常用遍历算法的实现,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2020-12-12
  • C语言中getch()函数详解及简单实例

    C语言中getch()函数详解及简单实例

    这篇文章主要介绍了C语言中getch()函数详解及简单实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • C语言简明讲解单引号与双引号的使用

    C语言简明讲解单引号与双引号的使用

    这篇文章主要介绍了在C语言里单引号和双引号的使用,本文通过实例代码说明了单引号和双引号的概念与各自的用法,以下就是详细内容,需要的朋友可以参考下
    2022-04-04
  • C语言实现十进制转任意进制的代码详解

    C语言实现十进制转任意进制的代码详解

    这篇文章主要介绍了C语言实现十进制转任意进制,运用一个数组,通过数字每次取任意进制模,存在数组中, 再通过倒取数组中的数值,来实现进制转换,如果遇到十六进制,利用ASCII码值  数字字符和大写字母 相差55的特性来解决,文中有详细代码示例,需要的朋友可以参考下
    2024-05-05
  • C++ typedef常见用法详解

    C++ typedef常见用法详解

    这篇文章主要介绍了C++ typedef用法详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Pipes实现LeetCode(194.转置文件)

    Pipes实现LeetCode(194.转置文件)

    这篇文章主要介绍了Pipes实现LeetCode(194.转置文件),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++ opencv实现车道线识别

    C++ opencv实现车道线识别

    这篇文章主要为大家详细介绍了C++ opencv实现车道线识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02

最新评论