【数据结构】并查集的简单实现,合并,查找(C++)

文章目录

  • 前言
    • 举例:
  • 一、
    • 1.构造函数
    • 2.查找元素属于哪个集合FindRoot
    • 3.将两个集合归并成一个集合Union
    • 4.查找集合数量SetCount
  • 二、源码


前言

需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。

举例:

学生小分队s1={0,6,7,8},成都学生小分队s2={1,4,9},武汉学生小分队s3={2,3,5}就相互认识了,10个人形成了三个小团体。假设右三个群主0,1,2担任队长,负责大家的出行。
在这里插入图片描述

在这里插入图片描述

西安小分队中8号同学与成都小分队1号同学奇迹般的走到了一起,两个
小圈子的学生相互介绍,最后成为了一个小圈子:
在这里插入图片描述

仔细观察数组中内融化,可以得出以下结论:

  1. 数组的下标对应集合中元素的编号
  2. 数组中如果为负数,负号代表根,数字代表该集合中元素个数
  3. 数组中如果为非负数,代表该元素双亲在数组中的下标

一、

1.构造函数

UnionFindSet(size_t size):_set(size,-1)//数组中初始化为-1//数组的下标对应集合中元素的编号//数组的内容如果是非负数代表这个元素的根的下标//数组内容为负数,代表这个数字为根,绝对值为这棵树的大小{}

2.查找元素属于哪个集合FindRoot

size_t FindRoot(int x) {//. 查找元素属于哪个集合while (_set[x] >= 0) {x = _set[x];}//找到非负的数,这个数的下标即为根的下标return x;}

3.将两个集合归并成一个集合Union

void Union(int x1, int x2) {//将两个集合归并同一个集合//将元素x2合并进x1int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 != root2) {//保证两个元素不在同一个集合中_set[root1] += _set[root2];// x2根的内容为负数绝对值为这棵树的数量//把x2归并到x1所在集合中//x1所在集合的大小发生变化_set[root2] = root1;//x2的根发生变化}}

4.查找集合数量SetCount

size_t SetCount() {//统计集合数量(有多少棵树)int count = 0;for (size_t i = 0; i < _set.size(); i++) {if (_set[i] < 0) {count++;}}//负数的数量即根的数量即集合的数量return count;}

二、源码

class UnionFindSet {
public:UnionFindSet(size_t size):_set(size,-1)//数组中初始化为-1//数组的下标对应集合中元素的编号//数组的内容如果是非负数代表这个元素的根的下标//数组内容为负数,代表这个数字为根,绝对值为这棵树的大小{}size_t FindRoot(int x) {//. 查找元素属于哪个集合while (_set[x] >=0) {x = _set[x];}//找到非负的数,这个数的下标即为根的下标return x;}void Union(int x1, int x2) {//将两个集合归并同一个集合//将元素x2合并进x1int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 != root2) {//保证两个元素不在同一个集合中_set[root1] += _set[root2];// x2根的内容为负数绝对值为这棵树的数量//把x2归并到x1所在集合中//x1所在集合的大小发生变化_set[root2] = root1;//x2的根发生变化}}size_t SetCount() {//统计集合数量(有多少棵树)int count = 0;for (size_t i = 0; i < _set.size(); i++) {if (_set[i] < 0) {count++;}}//负数的数量即根的数量即集合的数量return count;}private:vector<int> _set;};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288713.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交叉验证之KFold和StratifiedKFold的使用(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

文件操作学习总结

磁盘上的⽂件是⽂件。 但是在程序设计中&#xff0c;我们⼀般谈的⽂件有两种&#xff1a; 程序⽂件、数据⽂件 &#xff08;从⽂件功能的⻆度来分类 的&#xff09;。 程序⽂件 &#xff1a; 程序⽂件包括源 程序⽂件&#xff08;后缀为.c&#xff09; , ⽬标⽂件&#xff0…

Opencv入门四(宽高为原始图像的一半)

代码如下&#xff1a; #include <opencv2/opencv.hpp> int main(int argc, char** argv) { cv::Mat img1, img2; cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE); cv::namedWindow("Example2", cv::WINDOW_AUTOSIZE); img1 cv…

Mac如何搭建本地服务器

苹果电脑Mac OS X系统自带了Apache服务器 打开终端 //开启apache&#xff1a;sudo apachectl start //重启apache&#xff1a;sudo apachectl restart //关闭apache&#xff1a;sudo apachectl stop在浏览器输入127.0.10.1 &#xff0c; 如果页面出现 it works&#xff0c;则…

【LeetCode刷题笔记(12-1)】【Python】【有效的字母异位词】【排序/字符统计】【简单】

文章目录 引言有效的字母异位词题目描述提示 解决方案1&#xff1a;【排序】解决方案2&#xff1a;【字符统计】结束语 有效的字母异位词 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0c;但…

vcomp140.dll丢失怎么办,vcomp140.dll丢失解决方法详解

在我多年的电脑使用经历中&#xff0c;我曾经遇到过一个非常棘手的问题&#xff0c;那就是vcomp140.dll丢失。这个问题让我苦恼了很久&#xff0c;但最终我还是找到了解决方法。今天&#xff0c;我想和大家分享一下我的经历&#xff0c;以及vcomp140.dll是什么&#xff0c;它丢…

【开源软件】最好的开源软件-2023-第四名 vaadin

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

VR全景技术在政务服务中有哪些应用,为政务服务带来什么便利

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术正逐渐成为政务服务领域的一项重要工具。其独特的沉浸式体验为政务服务带来了全新的便利&#xff0c;提升了公众参与的积极性。 一、VR全景技术在政务服务中的应用 1.虚拟实景政务…

VUE实现购物商城网站前端源码

文章目录 1.设计来源1.1 登录注册页面1.2 主界面1.3 列表界面1.4 详细界面1.5 购物车界面 2.源码2.1源码目录结构2.2源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/135054910 VUE实现购物商城网站前端源码&…

[CVPR-23] PointAvatar: Deformable Point-based Head Avatars from Videos

[paper | code | proj] 本文的形变方法被成为&#xff1a;Forward DeformationPointAvatar基于点云表征动态场景。目标是根据给定的一段单目相机视频&#xff0c;重建目标的数字人&#xff0c;并且数字人可驱动&#xff1b;通过标定空间&#xff08;canonical space&#xff09…

网络编程day5

作业 1> 使用select完成TCP客户端程序 //client #include<myhead.h> #define CLINET_IP "192.168.125.79" #define CLINET_PORT 9999 #define SERVE_IP "192.168.125.79" #define SERVE_PORT 8888 int main(int argc, const char *argv[]) {/…

JVM垃圾收集器三色标记算法

垃圾收集算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;这种算法没有什么新的思想&#xff0c;只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比…