<数据结构>并查集

目录

并查集概念

合并

 查找集合的数量

并查集类代码实现


并查集概念

并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合

不过并查集是森林的概念,并查集的学习可以帮助我们去更好的学习图这个数据结构

这里我们举一个例子:

假设我们有一个旅游团,一共有十个人,编号是0~9;

其中 s1 = {0,6,7,8} 这几个人来自湖北

        s2 = {1,4,9} 这几个人来自四川

        s3 = {2,3,4} 这几个人来自北京

上面我们把十个人分为了不同几个小组,他们来自不同的地方,吃的口味自然不同,于是就分别让0,1,2这三个人担任组长,带领各自的队伍去吃饭。

队长可以抽象的理解为头结点,组员理解为各自的孩子结点

数组的初始化规则定义如下:

1.每一个下标存放自己的双亲结点下标

2.如果该结点是双亲结点,存放一个负数,我们可以顺便存放这棵树的结点个数

特点:

  • 一个位置是负数,那他就是树的根,这个绝对值就是棵树的结点个数
  • 一个位置值是负数那他就是双亲的下标

合并

我们假设上面的s1和s2发生了合并,咋办呢?

步骤:

  • 先找到两个需要合并集合的双亲结点
  • 再把集合2的根下标存放的值+=集合1的根下标,在把集合2的根下标存放的值置为集合1的根

 查找集合的数量

我们只需要将整个数组遍历一遍,找到为负数的位置有多少个,即集合的数量

并查集类代码实现

class UnionFindSet
{
public:UnionFindSet(size_t n):_ufs(n, -1){}void Union(int x1, int x2){// 1.先找根int root1 = FindRoot(x1);int root2 = FindRoot(x2);//如果在一个集合就没有必要去合并if (root1 == root2){return;}//将集合2合并到集合1_ufs[root1] += _ufs[root2];_ufs[root2] = root1;}// 找根/双亲int FindRoot(int x){ int parent = x;while (_ufs[parent] >= 0){parent = _ufs[parent];}return parent;}bool InSet(int x1, int x2){return FindRoot(x1) == FindRoot(x2);}size_t SetSize(){size_t size = 0;for (size_t i = 0; i < _ufs.size(); ++i){if (_ufs[i] < 0){++size;}}return size;}private:vector<int> _ufs;
};

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

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

相关文章

IDEA中侧边栏没有git commit模块,如何恢复?

一、修改之前 侧边栏没有git commit模块 二、修改之后 侧边栏恢复了git commit模块 三、下面是恢复教程 1.中文版 打开 文件 -> 设置 -> 版本控制 -> 提交 -> 勾选 【使用非模式提交界面】 -> 点击【确定】 2.英文版 打开 file -> Settings -> Version Co…

JAVA使用POI对Word docx模板文件替换数据工具类并通过浏览器下载到本地

需求:需要上传一个带有占位符的模板至数据库保存,然后解析模板的占位符,通过类计算结果替换模板中的占位符,并且保存至本地 难点:1.由于我数据库保存是本地保存,并没有path 所以获取模板的path是个难点 String fileBucket = sysFileInfo.getFileBucket();if(fileBucket=…

同步和异步的区别

同步&#xff0c;可以理解为在执行完一个函数或方法之后&#xff0c;一直等待系统返回值或消息&#xff0c;这时程序是处于阻塞的&#xff0c;只有接收到返回的值或消息后才往下执行其他的命令&#xff1b; 异步&#xff0c;执行完函数或方法后&#xff0c;不必阻塞性地等待返回…

Linux与Windows:操作系统的比较与技巧分享

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【数学建模】国赛真题分析 2012 A题 葡萄酒的评价

2012 A题 葡萄酒的评价 优秀论文地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/19WGpybgM6RncxTYhx61JRA?pwdvl22 提取码&#xff1a;vl22 –来自百度网盘超级会员V6的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

Go语言中的JSON库简介

Go 标准库中的 encoding/json 包提供了 JSON 数据的编码和解码功能。 在日常开发中&#xff0c;我们主要使用的函数有解析字符串类型的 Marshal 和 Unmarshal&#xff0c;以及处理流式 JSON 数据的 Encoder 和 Decoder。 一、Marshal 与 Unmarshal json.Marshal&#xff1a;…

[Python系列] 定时任务调度

起因 在计算机网络中&#xff0c;我们经常定期发送数据包、定期更新网络状态等&#xff1b;在操作系统中&#xff0c;也需要定时定期备份数据、定期清理缓存等&#xff1b;在应用程序中&#xff0c;我们也很需要定期更新数据、定期发送通知等。所以&#xff0c;到底怎么样才能有…

计讯物联网关型水利遥测终端机TY910确保闸站自动化监测长效运行

闸站是我国水利建设工程的重要组成部分&#xff0c;具备调度水源、防洪排涝、灌溉等能力&#xff0c;在农业、水路运输、养殖业等行业领域起着关键作用&#xff0c;进而解决区域水资源不均衡的问题&#xff0c;促进水资源多方面的利用。当前&#xff0c;我国闸站存在数量多、分…

线性代数 4 every one(线性代数学习资源分享)

Linear Algebra 4 Every One 版权说明&#xff0c;以下我分享的都是一个名叫Kenji Hiranabe的日本学者&#xff0c;在github上分享的&#xff0c;关于Gilbert Strang教授所撰写的《Linear Algebra for Everyone》一书的总结&#xff0c;更像是一个非常精美的线性代数手册&#…

ffmpeg命令行log的使用参数使用

1、使用report参数将log保存在文件中&#xff0c;但是这个命令参数需要和环境变量FFREPORT配合使用。 FFREPORTfilelog.txt:level100 ffmpeg -report -codec:v h264 -i .\zzsin_1280x720_30fps_60f.mp4 -frames:v 1 test.yuv该命令就可以将ffmpeg的log保存在文件log.txt中 …

.net core 2.1 简单部署IIS运行

netcore的项目不像netFramework那么方便部署到iis还是要费点功夫的 比如我想把这个netcore2.1的项目部署到iis并运行&#xff1a; 按照步骤走&#xff1a; 一、确认自己的netcore环境 1、需要安装下面3个环境包(如果电脑已安装请忽略) 检查是否安装cmd命令&#xff1a;cmd&…

《银行法律法规》三、银行管理——2、商业银行资产负债管理

第三章 商业银行资产负债管理 第一节 资产负债管理概述 考点1 资产负债管理的对象★★ 对于商业银行而言&#xff0c; 传统资产负债管理的对象即是银行的资产负债表。 传统资产负债管理的内涵是:根据外部形势变化及发展战略要求&#xff0c; 以资本约束为核心&#xff0c…

go mod vendor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包&#xff0c;它具有以下优点&#xff1a; 复制依赖&#xff1a;go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中&#xff0c;所以即使这些依赖包在外部源&#xff08;如 GitHu…

OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

文章目录 1、掩膜(Mask)是什么&#xff08;1&#xff09;从物理的角度来看&#xff1a;&#xff08;2&#xff09;图像处理中的掩膜Mask&#xff08;3&#xff09;掩膜的用法&#xff1a;&#xff08;4&#xff09;掩膜Mask 的运算&#xff1a; 2、setTo()函数&#xff1a;将图…

flutter开发实战-dio文件下载实现

flutter开发实战-dio文件下载实现 在开发中&#xff0c;需要下载文件&#xff0c;这里使用的是dio dio 是一个强大的 Dart HTTP 请求库&#xff0c;支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 一、引入d…

QGraphicsDropShadowEffect的介绍

QGraphicsDropShadowEffect的介绍 QGraphicsDropShadowEffect是Qt中一个用于添加阴影效果的图形特效类&#xff0c;可以在图形或控件周围添加一层阴影效果。通过调整阴影的偏移、模糊度、颜色等参数&#xff0c;可以实现各种独特的视觉效果。 基本用法 添加阴影 首先&#…

JS脚本 - 批量给所有指定标签追加Class属性

JS脚本 - 批量给所有指定标签追加Class属性 前言一. 脚本二. 测试运行 前言 公司里我们有个应用引入了UBT埋点&#xff0c;记录了页面上所有的点击操作以及对应的点击按钮。但是我们看下来发现&#xff0c;我们需要给每个按钮加一个唯一标识做区分&#xff0c;并且这个ID是给U…

自动驾驶遥控泊车RPA系统功能规范

目 录 1. 版本履历... 4 2. 文档使用范围... 4 3. 术语缩写... 4 4. 系统概述... 5 4.1 系统功能说明... 5 4.2 泊车状态说明... 6 5. 产品基本参数... 6 5.1控制器基本参数... 6 5.2全景摄像头基本参数... 7 5.3 超声波传感器基本参数... 7 …

Flask 使用Flask的session来保存用户登录状态例子

使用Python的Flask库实现的登录接口、查询金额接口和注销接口的示例。 当用户发送POST请求到/login接口时&#xff0c;代码会获取请求中的用户名和密码。如果用户名和密码匹配&#xff08;在示例中是admin和admin123&#xff09;&#xff0c;则会将用户名保存在session中&…

docker命令

查看运行的容器&#xff1a;Docker ps 查看镜像&#xff1a;Docker images 停止容器运行&#xff1a;Docker stop 容器id 删除容器&#xff1a;docker rm 容器id 删除镜像&#xff1a;docker rmi 镜像id 镜像保存下来&#xff1a;docker save -o filename.tar 镜像仓库名称…