并查集的实现(c++,利用map)

本文介绍了并查集数据结构及其在解决不相交集合问题中的作用,重点讲解了如何使用C++的map来实现并查集,包括fathermap用于存储父子结点关系,sizemap用于记录每个集合的大小,从而在合并操作中优化路径压缩和集合合并策略。通过finddeputy函数查找代表结点,并判断元素是否在同一集合中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并查集(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)
   &nb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值