<数据结构>并查集

目录

并查集概念

合并

 查找集合的数量

并查集类代码实现


并查集概念

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

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

这里我们举一个例子:

假设我们有一个旅游团,一共有十个人,编号是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…

同步和异步的区别

同步&#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的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

计讯物联网关型水利遥测终端机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;更像是一个非常精美的线性代数手册&#…

.net core 2.1 简单部署IIS运行

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

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…

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

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

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

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

吴恩达机器学习2022-Jupyter特征缩放

1可选实验室: 特征缩放和学习率(多变量) 1.1 目标 在这个实验室里: 利用前一实验室开发的多变量线性回归模型程序在具有多种功能的数据集上运行梯度下降法探讨学习速度 alpha 对梯度下降法的影响通过使用 z 分数标准化的特征缩放来提高梯度下降法的性能 1.2 工具 您将使用…

Python爬虫学习笔记(三)————urllib

目录 1.使用urllib来获取百度首页的源码 2.下载网页图片视频 3.总结-1 4.请求对象的定制&#xff08;解决第一种反爬&#xff09; 5.编解码 &#xff08;1&#xff09;get请求方式&#xff1a;urllib.parse.quote&#xff08;&#xff09; &#xff08;2&#xff09;get请求…

RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

文章目录 一、使用Zookeeper的意义二、Zookeeper基础1 文件系统2 通知机制3 原生zkclient API存在的问题4 服务配置中心Zookeeper模块 三、Zk类实现Start方法创建节点、get节点值方法 四、框架应用rpc提供端框架rpc调用端&#xff08;客户端&#xff09;框架 总结 一、使用Zook…

flutter开发实战-生日等日期选择器DatePicker

flutter开发实战-生日等日期选择器DatePicker 在开发遇到设置生日等信息需要选择日期&#xff0c;这里用到的是CupertinoDatePicker iOS效果的日期、时间选择器 一、效果图 运行后效果图如下 二、代码实现 我们需要调用底部弹窗显示 //显示底部弹窗static void bottomShe…

Python实现PSO粒子群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

H3C-Cloud Lab实验-三层交换机实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. 按照图示为 PC2 和 PC3 配置 IP 地址和网关 2. PC2 属于 Vlan10&#xff0c;PC3 属于 Vlan20&#xff0c;在三层交换机上配置 Vlanif 三层接口实现 Vlan10 和 Vlan20 三层互通 3. PC2 和 PC3 可以互通 实验步骤&#xff1a…

WEB:Web_php_include(多解)

背景知识 文件包含 file://协议 php://协议 data://协议 了解strstr函数 题目 <?php show_source(__FILE__); echo $_GET[hello]; /*可以构造payload*/ $page$_GET[page]; while (strstr($page, "php://")) { /*strstr()函数*/$pagestr_replace("php://&q…

Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十&#xff09;自定义action names【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue httprunner …