【数据结构与算法-高阶】并查集

【数据结构与算法-高阶】并查集

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

🌼文章目录🌼

1. 并查集原理

2. 并查集实现

3. 并查集应用

1. 并查集原理

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

  比如:某公司今年校招全国总共招生10人,西安招 4 人,成都招 3 人,武汉招 3 人,10 个人都来自不同的学校,开始互不相识,每个学生都是独立的小团体,现在我们给这些学生编号: {0,1,2,3,4,5,6,7,8,9};给定一下数组用来存储这些学生的编号,数组中存储的值暂且先别管,后面再解释:

  毕业后,这些学生去到了这家公司,西安、成都、武汉的学生都各自组成了一个小团体前往公司:西安小分队s1 = {0,6,7,8},成都小分队s2 = {1,4,9},武汉小分队s3 = {2,3,5}。假设 0、1、2分别是三个小分队的队长。

  在一趟漫长的火车旅行之后,小分队里的人都熟络了起来,成为了一个朋友圈:

  此时这个朋友圈在数组中的形式就变成了这样(还是先别管数组中存储的值的意义,后面会解释):

  从上图就可以清晰明白:编号 6、7、8的同学属于 0号 的小队;编号4、9的同学属于 1号 的小队;编号3、5的同学属于 2号 的小队。

  此时我们仔细观察一下数组中的值加以思考就能得出以下结论:

① 数组的下标就是同学的编号

② 数组中为负数的值所对应的下标就是队长的编号,我们在这里称之为  

③ 数组中所有为非负数的值也是队长的编号,也就是非负数的值指向根

  在公司工作了一段时间后,西安小分队中的8号同学与成都小分队的1号同学关系变得越来越亲密,经过这两位同学的相互介绍,西安小分队和成都小分队最终融合成了一个圈子:

  此时数组也变换成:

  现在0号的队伍中有了7个人,2号的队伍中有2个人,总共两个朋友圈,也可以说,总共两个根。

  通过上述例子我们可以知道,并查集一般可以解决以下问题:

① 查找元素属于哪个集合:沿着该元素位置所存储的值一路跳转查找,直到遇到存储的值为负数的下标,就是集合的 根

② 查看两个元素是否属于同一个集合:依旧是跳转查找到存储的值为负数的下标,判断两个元素是否指向同一个根

③ 将两个集合归并为一个集合

④ 判断集合的个数

2. 并查集实现
//并查集
template <class T>
class Union
{
public:Union(size_t n):_a(n,-1){}//并集void UnionCom(size_t x,size_t y){//寻找x、y所在集合的根,用root1、root2接收int root1 = FindRoot(x);int root2 = FindRoot(y);if (root1 == root2) return;//如果两个元素在同一个集合,则无需合并,直接返回_a[root1] += _a[root2];//将 root2 存储的值存入 root1 中_a[root2] = root1;//将 root2 归并到 root1下}//寻根int FindRoot(size_t x){int flag = x;while (_a[flag] >= 0) flag = _a[flag];//沿着存储的值一路查找,直到找到存储的值为负数的下标return flag;}//求集合个数size_t UnionCount(){size_t count = 0;for (int i = 0; i < _a.size(); i++){if (_a[i] < 0) count++;//存储的值是负数的就是集合的根}return count;}//判断是否在同一集合中bool UnionSam(size_t x, size_t y){return (_a[x] == _a[y] && _a[x] != -1);}private:vector<int> _a;
};
3. 并查集应用

下面题目的题解在:【每日刷题】Day134-CSDN博客 中。

LCR 116. 省份数量 - 力扣(LeetCode)

class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int ans = 0;vector<int> ufs(isConnected.size(),-1);auto findRoot = [&ufs](int x){while(ufs[x]>=0) x = ufs[x];return x;};for(int i = 0;i<isConnected.size();i++){for(int j = 0;j<isConnected[i].size();j++){if(isConnected[i][j]){int root1 = findRoot(i);int root2 = findRoot(j);if(root1!=root2){ufs[root1]+=ufs[root2];ufs[root2] = root1;}}}}for(int i = 0;i<ufs.size();i++){if(ufs[i]<0) ans++;}return ans;}
};

990. 等式方程的可满足性 - 力扣(LeetCode)

class Solution {
public:bool equationsPossible(vector<string>& equations) {vector<int> ufs(26,-1);auto findRoot = [&ufs](int x){while(ufs[x]>=0) x = ufs[x];return x;};//相等放入同一集合for(auto str:equations){if(str[1]=='='){int root1 = findRoot(str[0]-'a');int root2 = findRoot(str[3]-'a');if(root1!=root2){ufs[root1]+=ufs[root2];ufs[root2] = root1;}}}//不相等判断是否在同一个集合,如果在则相悖for(auto str:equations){if(str[1]=='!'){int root1 = findRoot(str[0]-'a');int root2 = findRoot(str[3]-'a');if(root1==root2) return false;}}return true;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

charAt,chartCodeAt,codePointAt,fromCodePoint,fromCharCode

生僻字的length算2,有些空格是特殊空格,比如\u3000 u3000不是全角空格&#xff0c;u3000是表意字空格&#xff08;Ideographic Space&#xff09;&#xff0c;宽度和一个表意字&#xff08;汉字&#xff09;相同。它应当被当做汉字来处理。比如&#xff0c;在一些排版中&#x…

OpenSource - License 开源项目 TrueLicense

文章目录 官网集成Demo 官网 https://truelicense.namespace.global/ https://github.com/christian-schlichtherle/truelicense 集成Demo https://github.com/christian-schlichtherle/truelicense-maven-archetype https://github.com/zifangsky/LicenseDemo https://git…

map和set(c++)

前言 在前面我们在介绍二叉搜索树时我们分别实现了一个key结构和key-val结构&#xff0c;如果我们再进一步完善这棵树&#xff0c;将二叉搜索树升级为红黑树去存储key和key-val那么我们就可以得到我们今天要介绍的主角map和set。当然了标准库的实现还是有很多需要注意的地方&a…

植物大战僵尸修改器-MFC

创建项目 创建mfc应用 基于对话框 打开资源视图下的 IDD_MFCAPPLICTION2_DIALOG 限制对话框大小 将属性中Border的值改为对话框外框 删除对话框中原有的控件 属性-外观-Caption 设置对话框标题 工具箱中拖放一个按钮 修改按钮名称 将按钮ID改为IDC_COURSE 在MFCApplication2…

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

QT安装成功后-在创建项目时,发现仅有项目名文件

&#xff08;1&#xff09;QT安装成功后&#xff0c;发现仅有项目名文件其他可编辑文件缺失 &#xff08;2&#xff09;点击文件名左上角的感叹号显示【No kits are enabled for this project. Enable】 小编在尝试多次后发现&#xff0c;可以通过以下方式解决&#xff1a;QT软…

接着上一篇stp 实验继续

理论看上一篇&#xff0c;我们直接实验 首先找出&#xff52;&#xff4f;&#xff4f;&#xff54; 桥 很明显 &#xff53;&#xff57;&#xff11; 为&#xff52;&#xff4f;&#xff4f;&#xff54; 桥&#xff0c;所谓&#xff53;&#xff57;&#xff11;  &a…

从Hinton获得今年的诺贝尔物理学奖说起

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号&#xff0c;主要分享人工智能的基础知识、技术发展、学习经验等。此外&#xff0c;订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务&#xff0c;欢迎大家前来咨询&#xff0c;实现自己的…

JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录 一、集合框架体系(重要) 二、集合引入 (一)集合的理解与好处 三、Collection接口 (一)Collection接口实现类的特点 (二)Collection接口常用方法 (三)Collection接口遍历元素的方式(Iterator和增强for) 1.使用Iterator(迭代器) 1.1Iterator(迭代器)介绍 1.2Itera…

OmniH2O——通用灵巧且可全身远程操作并学习的人形机器人(其前身H2O是HumanPlus的重要参考)

前言 由于我司一直在针对各个工厂、公司、客户特定的业务场景&#xff0c;做解决方案或定制开发&#xff0c;所以针对每一个场景&#xff0c;我们都会反复考虑用什么样的机器人做定制开发 于此&#xff0c;便不可避免的追踪国内外最前沿的机器人技术进展&#xff0c;本来准备…

指针函数C++

指针函数概念 指针函数在C中是一种特殊类型的函数。从本质上讲&#xff0c;它是一个函数&#xff0c;不过其返回值是一个指针类型的数据。例如&#xff0c;像int* plusfunction(int a, int b);这样的函数声明&#xff0c;plusfunction就是一个指针函数&#xff0c;它接受两个i…

【学习笔记】Linux系统基础知识4 —— date命令详解

提示&#xff1a;学习Linux系统基础命令 date 命令详解 一、前期准备 1.已经正确安装并成功进入Linux系统 说明&#xff1a;本实验采用的 Redhat 系统&#xff08;因系统不一致&#xff0c;可能部分显示存在差异&#xff09; 二、学习内容 1、date命令 1. 功能说明 date …

SpringBoot实现电子文件签字+合同系统

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代企业中&#xff0c;合同管理和电子文件签字已成为日常运营不可或缺的一部分。为了提升效率和安全性&#xff0c;我们可以使用SpringBoot框架来实现一个电子文件签字和合同管理系统。本文将详细介绍如何…

ITMS-90899: Macs with Apple silicon support issue

文章目录 1.问题2.解决方法2.1 直接忽略这个警告邮件&#xff0c;不会影响app的正常上传2.2 通过在项目的Info.plist文件中加LSMinimumSystemVersion : 12.0 来消除警告 参考链接&#xff1a; 1.问题 ITMS-90899: Macs with Apple silicon support issue - The app isn‘t comp…

机器学习入门(一)

一、机器学习概述 1、人工智能 像人一样智能的综合与分析&#xff0c;机器模拟人类。 是一个系统&#xff0c;像人那样思考&#xff0c;像人那样理性思考。 是一个系统&#xff0c;像人那样活动&#xff0c;像人那样合理的系统 2、机器学习 让机器自动学习&#xff0c;而不…

公司防泄密软件哪个好?6款公司内部文件防泄密软件,2024超好用推荐!

企业的核心机密就如同生命之源&#xff0c;然而&#xff0c;数据泄露的风险也随之而来&#xff0c;让不少企业头疼不已。 面对这一挑战&#xff0c;选择一款高效、可靠的防泄密软件显得尤为重要。 那么&#xff0c;公司防泄密软件哪个好&#xff1f; 接下来&#xff0c;就让我…

posix接口与system V接口及其异同

POSIX接口和System V接口是用于多线程和进程间通信的两种主要编程接口。它们各自有不同的特点、功能和适用场景。以下是对这两种接口的详细介绍及其异同点。 POSIX接口 特点 标准化: POSIX&#xff08;可移植操作系统接口&#xff09;是由IEEE制定的标准&#xff0c;旨在提供统…

​ ​视觉任务大一统!图像生成,编辑,翻译三合一!全能视觉助手PixWizard来袭!

文章链接&#xff1a;https://arxiv.org/pdf/2409.15278 github链接&#xff1a;https://github.com/AFeng-x/PixWizard 亮点直击 任务统一&#xff1a;针对视觉任务的多样性&#xff0c;提出将其框架化为图像到图像的转换问题&#xff0c;并通过后处理将生成的可视化效果转化…

瑞华技术募资额巨降过半:业绩大幅下滑,信用期外应收账款占比高

《港湾商业观察》黄懿 上市的节奏有快有慢&#xff0c;常州瑞华化工工程技术股份有限公司&#xff08;下称“瑞华技术”&#xff0c;920099.BJ&#xff09;自2023年3月被北交所受理后&#xff0c;于2024年8月29日获得注册批文&#xff0c;9月25日正式挂牌上市。 据了解&#…

大学生课程设计报告--基于JavaGUI的贪吃蛇

前言 ​ 贪吃蛇游戏是一个基础且经典的视频游戏,它适合作为学习编程的人进行一些更深入的学习,可以更加了解关于循环,函数的使用,以及面向对象是如何应用到实际项目中的; ​ 不仅如此,贪吃蛇游戏的规则在思考后可以拆分,有利于学生将更多精力去设计游戏的核心逻辑,而…