高阶数据结构——并查集 - 详解

news/2025/10/7 8:51:46/文章来源:https://www.cnblogs.com/slgkaifa/p/19128177

高阶数据结构——并查集 - 详解

1.并查集原理

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

        举个例子:大学社团招新,一共招10人其中科协招4人,艺术团招3人,青协招3人,这10个人刚开始时相互并不认识,每个学生就是一个独立的团体,现在对这些学生编号:{0,1,2,3,4,5,6,7,8,9};用下面的数组来存储这个小集体,数组中的数字代表该小集体的中的成员个数,负号表示为根节点

        他们准备去社团报道,每个社团的学生自发组织成小队一起去报道,于是:科协小队{0,6,7,8},艺术团小队{1,4,9},青协小队{2,3,5},就这样10个人形成了3个小团体,假设左三个人为队长那么就有了下图

        如果用数组来表示就是下面这张图

        从上图可以看出:编号6,7,8同学属于0号小队,该小分队有4人,同理可以推出其他小队的人数和成员。

        仔细观察数组,可以得出以下结论:

                1.数组的下标对应集合中元素的编号

                2.数组中如果是负数代表根,数字代表该集合中元素的个数

                3.数组中如果为非负数,代表该元素的根在数组中的下标

        假设在社团工作一段时间后,1和8成为了好朋友,那么两个小圈子的学生相互介绍,最后这两个小圈子就融成了一个大圈子:

        通过上面的例子可知,并查集一般可以解决以下问题:

                1.查找元素属于那么集合:沿着数组表示树形关系往上一直找到根(即:树中元素为负数的位置)

                2.查看两个元素是否属于同一个集合:沿着数组表示的树形关系往 上一直找到树的根,如果根相同表明在同一个集合,否则不在

                3.将两个集合归并成一个集合:将两个集合中的元素合并或者将一个集合名称改成另一个集合的名称

                4.获取集合的个数:遍历数组,数组中元素为负数的个数即为集合的个数

2.并查集实现

#include 
#include class union_find_set{
public:
union_find_set(int size)
:_ufs(size,-1){}int Findroot(int index)
{
while(_ufs[index] >= 0)
{
index = _ufs[index];
}
return index;
}
bool Union(int index1,int index2)
{
int root1 = Findroot(index1);
int root2 = Findroot(index2);if(root1 == root2) return false;
_ufs[root1] += _ufs[root2];
_ufs[root2] = root1;
return true;
}
size_t Count()
{
int count = 0;
for(auto e:_ufs) if(e < 0) count++;
return count;
}
public:
std::vector<int> _ufs;
};

测试模块代码:

#include "unionfindset.hpp"
#include int main()
{
union_find_set test(10);
test.Union(0,6);
test.Union(0,7);
test.Union(0,8);
test.Union(1,4);
test.Union(1,9);
test.Union(2,3);
test.Union(2,5);
test.Union(8,1);
for(auto ch:test._ufs) std::cout<" ";
return 0;
}

结果如下

3.并查集应用

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

class Solution {
public:
int findCircleNum(vectorint>>& isConnected) {
int len = isConnected.size();
vector<int> _map(len,-1);
auto FindRoot = [&_map](int x)->int{
while(_map[x] >= 0) x = _map[x];
return x;
};
for(int i = 0;isize();i++)
{
for(int j = 0;jsize();j++)
{
if(isConnected[i][j] == 1)
{
int root1 = FindRoot(i), root2 = FindRoot(j);
if(root1 == root2) continue;
_map[root1] += _map[root2];
_map[root2] = root1;
}
}
}
int ret = 0;
for(int i = 0;i<_map.size();i++) if(_map[i] < 0) ret++;
return ret;
}
};

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

简单讲讲思路:将相等的数据和不相等的数据视为两个子集如果两个子集有交集那么就是false否则就是true

class Solution {
public:
bool equationsPossible(vector& equations) {
vector<int> _map(26,-1);
auto FindRoot = [&_map](int x)->int{
while(_map[x] >=0) x = _map[x];
return x;
};for(auto ch:equations)
{
if(ch[1] == '=')
{
int root1 = FindRoot(ch[0]-'a'), root2 = FindRoot(ch[3]-'a');
if(root1 != root2)
{
_map[root1] += _map[root2];
_map[root2] = root1;
}
}
}for(auto ch:equations)
{
if(ch[1] == '!')
{
int root1 = FindRoot(ch[0]-'a'), root2 = FindRoot(ch[3]-'a');
if(root1 == root2) return false;
}
}
return true;
}
};

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

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

相关文章

网站建设方案范文网站建设详细报价

继续炒股。第一题是买卖股票的最佳时机IIIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/&#xff0c;与上题不同的是&#xff0c;本题要求买卖的次数要限制在2次以内。对上题的dp数组&#xff0c;显然要增加它的状态以适应题目要求。对于遍历…

经过基于流视频预测的可泛化双手运行基础策略

经过基于流视频预测的可泛化双手运行基础策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

公司网站打不开微博+wordpress

1. 不说负能量的话&#xff0c;会引发自己的负能量 在日常生活中&#xff0c;我们的语言不仅能够影响他人&#xff0c;更能影响我们自己。负能量的话语&#xff0c;如抱怨、批评或消极的自我对话&#xff0c;会潜移默化地影响我们的心态和情绪。为了维持积极的心态&#xff0c…

进程——环境变量及软件地址空间

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

软件开发与网站开发的区别网站落地页如何做

/*java中的集合类 实现了 Connection接口ArrayList这个集合类 java.util.*这个包的类toArray()方法可以返回一个 Object类型的对象数组我们部队 ArratList进行泛型规范那么就会警告 但是还是可以运行的这是因为JDK1.5中引进了泛型&#xff0c;但是你的ArrayList却没有采用&a…

高唐做网站建设的公司小皮怎么创建网站

目录 题目答案运行结果 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组…

自己可做以做网站吗天元建设集团有限公司商票兑付情况

520这一天&#xff0c;也是网络情人节。就在那天&#xff0c;如果没有女朋友的自己&#xff0c;如何假装自己是有朋友的&#xff01;如何在朋友圈“秀恩爱。女生版&#xff1a;image很有感觉有木有~~男生版&#xff1a;imageimage其实这些都是小意思啦~~这些都是假装自己有女朋…

【HarmonyOS 5】鸿蒙Taro跨端框架 - 教程

【HarmonyOS 5】鸿蒙Taro跨端框架 - 教程2025-10-07 08:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

遵义祥云平台网站建设中国企业500强排名2021

《童年》是高尔基自传体小说三部曲中的第一部&#xff0c;讲述的是高尔基幼年丧父、母亲改嫁&#xff0c;他跟随日渐破落的小染坊主外公以及外婆生活的童年经历。小说通过一个儿童天真无邪的眼光&#xff0c;向读者生动地展示了19世纪中叶俄罗斯社会底层人民的生活状态&#xf…

学习unigui【37】nginx的反向代理 ,程序中的重新定向

学习unigui【37】nginx的反向代理 ,程序中的重新定向默认port:9077 希望IP:81后访问9077。于是就采用nginx。问题当点击下载文件或浏览文件等时,怎么知道用户是通过81口访问的? UniGUI 没有暴露 RequestHeader(s),…

php空间放多个网站做好的网站如何上线

如果聊起国内的智能机市场&#xff0c;我想大多数人的印象就是疯狂内卷。卷影像、卷屏幕、卷快充、卷性能……客观地说&#xff0c;国内的3C产品还是很有质价比的。不过在没有如此内卷的日本市场&#xff0c;各种小屏手机仍旧是主流。 除了苹果外&#xff0c;日本本土品牌的夏普…

我和宠物做朋友教案小精灵网站iis怎么使用来建设一个网站

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 开头先分享个有趣的哈哈哈 承包了我一天的快乐秧 点击此处…

wordpress建的大型网站吗云适配 网站

刷题 309.最佳买卖股票时机含冷冻期 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多…

wordpress手机网站个人网站建设收费标准

一、前言 前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用&#xff0c;ES现在已升级到8.5版本&#xff0c;有些概念和SDK用法都有很大变化&#xff0c;后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。 二、映射 ES环…

北京SEO网站优化公司郑州网站推广公司

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

单页面推广网站模版汉语网站建设心得

JL-8集成电路电流继电器 系列型号 JL-8A/11集成电路电流继电器;JL-8B/11集成电路电流继电器; JL-8A/12集成电路电流继电器;JL-8B/12集成电路电流继电器; JL-8A/13集成电路电流继电器;JL-8B/13集成电路电流继电器; JL-8A/21集成电路电流继电器;JL-8B/21集成电路电流继电器; JL-…

关于网站开发的商业计划书四川省建设厅注册中心网站

这是第三部分&#xff08;第一&#xff0c;第二部分&#xff09;&#xff0c;非常有意思的问答&#xff0c;值得仔细琢磨。 这里只是一些和程序员发展&#xff0c;面试&#xff0c;优秀程序员的特点等相关的部分。 有些想法和 MSF 中的原则也很相似 &#xff08;见 <移山之…

解决Docker存储空间不足问题 - 指南

解决Docker存储空间不足问题 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

长沙市做网站的网站图标在哪里做修改

背景 有序列表换行后自动开启下一个标号&#xff0c;让人苦恼。 操作 操作系统换行操作 1. 【Enter】键是硬回车&#xff0c;即段落标记。回车后文字属于下一段落 2. 【shiftEnter】是软回车快捷键。即人工换行符。回车后文字仍属于前一段落&#xff0c;只不过重新换行。 …

深圳高端网站建设公司人工智能培训心得体会

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一.目录和文件的操作 1.cd 命令 切换到d盘 2.目录分为相对路径和绝对路径 3. dir命令 用于显示目录和文件列表 4. md 或 mkdir 创建目录 5. rd 用于删…