【C++】并查集的原理与使用 - 教程

news/2026/1/16 20:22:19/文章来源:https://www.cnblogs.com/ljbguanli/p/19493912

【C++】并查集的原理与使用 - 教程

在这里插入图片描述
各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。
如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步!

也欢迎关注我的blog主页:落羽的落羽

文章目录

  • 一、并查集的概念
  • 二、并查集的实现
  • 三、算法题中的应用

一、并查集的概念

在一些场景中,需要将n个不同元素划分为一些不相交的集合。开始时,每个元素各成一个元素,然后按一定的规律将属于同一组的元素合并。这个过程中需要反复用到查询一个元素是否属于某个集合的算法。适合用于这种场景的数据结构是并查集(Union-Find Set)!

并查集的底层结构本质上是一片森林(多棵树的集合)

比如,我现在有九个数据元素,给他们编号0~8:
在这里插入图片描述

按照某种需求,这些数据被分组合并为:

在这里插入图片描述

按照其他需求,这些树可以继续合并下去…

而这个森林,可以用一个数组记录下来元素的关系!
我们可以规定并查集用数组下标代表每个元素,数组内容代表元素之间的关系:

  • 数组下标代表元素编号
  • 如果数组内容为负整数,代表这个下标是根,绝对值表示它这棵树的元素个数
  • 如果数组内容为非负整数,代表这个下标不是根,数组内容是它的父亲在数组中的下标

比如,上面的森林例子,用并查集数组表示,就是:

在这里插入图片描述
如果元素的数据类型不能直接作为数组下标,只要在实现中用std::map之类的结构,建立元素到下标的映射关系,就能解决了!

通过并查集的特点,可以看出并查集一般能解决:

  • 查找元素属于哪个集合:沿着数组一直找到元素为负数,就是根
  • 查看两个元素是否属于一个集合:看看这两个元素的根是否相同
  • 将两个集合归并为一个集合:假如要将下标a的树合并到下标b的树中,arr[b] += arr[a],arr[a] = b即可,即令1成为0的一个孩子
  • 统计集合的个数:统计数组中元素为负数的个数

二、并查集的实现

#pragma once
#include<vector>#include<iostream>using namespace std;class UnionFindSet{public:UnionFindSet(int size):_set(size, -1) // 初始时每个数据各是一棵树,元素均为-1{ }// 查找一个数据属于哪个集合,找根元素的下标int FindRoot(int i){while (_set[i] >= 0){i = _set[i];}return i;}// 合并两个数据所在的集合void Union(int i1, int i2){// 找这两个数据的根下标int root1 = FindRoot(i1);int root2 = FindRoot(i2);if (root1 != root2){_set[root1] += _set[root2];_set[root2] = root1;}// 如果root1 == root2,说明这两个数据本就在一个集合,不用合并}// 判断两个数据是否在同一个集合bool IsSameSet(int i1, int i2){return FindRoot(i1) == FindRoot(i2);}// 统计集合个数int SetCount(){int ret = 0;for (int n : _set){if (n < 0)ret++;}return ret;}private:vector<int> _set;};

测试:

在这里插入图片描述

三、算法题中的应用

并查集的特点在某些算法题中很有用:

class Solution {
public:
// 并查集, 统计集合数量
int findCircleNum(vector<vector<int>>& isConnected) {vector<int> ufs(isConnected.size(), -1);auto findRoot = [&ufs](int i){while(ufs[i] >= 0){i = ufs[i];}return i;};auto Union = [&ufs, &findRoot](int i1, int i2){int root1 = findRoot(i1);int root2 = findRoot(i2);if(root1 != root2){ufs[root1] += ufs[root2];ufs[root2] = root1;}};auto SetCount = [&ufs](){int ret = 0;for(int n : ufs){if(n < 0)ret++;}return ret;};for(int i = 0; i < isConnected.size(); i++){for(int j = 0; j < isConnected[i].size(); j++){if(isConnected[i][j] == 1){Union(i, j);}}}return SetCount();}};
  • 等式方程的可满足性在这里插入图片描述
class Solution {
public:
// 并查集,数组大小26
// 遍历一次把所有==的两个字母放到一个集合,再遍历一次看!=的两个字符是否都在集合中出现过,出现过则false
bool equationsPossible(vector<string>& equations) {vector<int> ufs(26, -1);auto findRoot = [&ufs](int i){while(ufs[i] >= 0){i = ufs[i];}return i;};auto Union = [&ufs, &findRoot](int i1, int i2){int root1 = findRoot(i1);int root2 = findRoot(i2);if(root1 != root2){ufs[root1] += ufs[root2];ufs[root2] = root1;}};for(string& s : equations){if(s[1] == '='){Union(s[0]-'a', s[3]-'a');}}for(string& s : equations){if(s[1] == '!'){int root1 = findRoot(s[0]-'a');int root2 = findRoot(s[3]-'a');if(root1 == root2){return false;}}}return true;}};

本篇完,感谢阅读!

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

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

相关文章

[特殊字符] 深入理解 Android 输入设备配置:从键盘布局文件到用户体验

作者&#xff1a;你的 Android 老朋友 时间&#xff1a;2026年1月7日 一句话核心&#xff1a;当你按下键盘上的按键时&#xff0c;Android 系统是如何知道该显示什么字符的&#xff1f;本文将带你深入了解这个神奇的过程&#xff01;&#x1f31f; 引言&#xff1a;你是否想过&…

基于cisco的企业网(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于cisco的企业网(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 IP论文 基于cisco的企业网 实物报告 均可ping通

2026年专业的草坪灯,景观灯,景观灯厂家选型决策榜单 - 品牌鉴赏师

引言在 2026 年的当下,随着城市建设的不断推进,专业的草坪灯、景观灯在城市景观打造、照明亮化等方面发挥着愈发重要的作用。为了给广大消费者和相关工程采购方提供科学、公正、客观的景观灯厂家选型参考,我们依据多…

解决本地访问远程桌面端口被拦截

本地访问远程服务器上的服务,访问http:xxx:8080端口不通,解决思路和排查流程如下: 1. 第一步:确认 Java 服务是否真的启动且监听 8080 端口(服务器本地验证) 这是最基础的前提 —— 如果服务没启动 / 监听端口错误,后续排查都无意义。 操作方法(在远程桌面的服务器上…

比话降AI使用教程:手把手教你5分钟把论文AI率降到10%以下

比话降AI使用教程&#xff1a;手把手教你5分钟把论文AI率降到10%以下 TL;DR 比话降AI是专门针对知网AIGC检测系统设计的降AI工具&#xff0c;使用10亿真实论文数据训练&#xff0c;能将AI率稳定降至10%-15%。本教程将从注册、设置到最终降重&#xff0c;一步步教你如何高效使…

世岩清上:以现代化企业展厅为战略支点,赋能企业高质量发展

在数字经济与体验经济深度融合的新时代&#xff0c;企业竞争已从单一的产品性能比拼&#xff0c;转向涵盖品牌认知、用户信任、文化认同与生态协同的系统性较量。在此背景下&#xff0c;传统“陈列式”展厅正加速向现代化、智能化、战略化的企业价值中枢演进。一座精心设计的现…

做一个微信小程序要多少钱?小程序商城制作一个需要多少钱 - 码云数智

小程序制作需要多少钱?全面解析开发方式与避坑指南 随着移动互联网的发展,小程序已成为企业数字化转型的重要工具。然而,很多创业者和中小企业主在初次接触小程序时,最关心的问题就是:“做一款小程序到底要花多少…

2026年可靠的锂电太阳能路灯,市政路灯,led路灯厂家采购推荐指南 - 品牌鉴赏师

引言在城市的发展进程中,路灯作为基础设施的重要组成部分,不仅为人们的出行提供了安全保障,更在一定程度上彰显了城市的文化与形象。随着科技的不断进步,路灯行业也迎来了新的发展机遇与挑战,市场上的路灯厂家众多…

用嘎嘎降处理DeepSeek生成的论文:从90%降到8%的详细步骤

用嘎嘎降处理DeepSeek生成的论文&#xff1a;从90%降到8%的详细步骤 TL;DR DeepSeek生成的论文AI率通常在80%-100%&#xff0c;直接交上去必挂。本文详解如何用「DeepSeek自改嘎嘎降AI精处理」的两步法&#xff0c;把AI率从90%降到8%&#xff0c;包含完整的操作步骤和Prompt模…

Docker讲解

2.Docker基础 接下来&#xff0c;我们一起来学习Docker使用的一些基础知识&#xff0c;为将来部署项目打下基础。具体用法可以参考Docker官方文档&#xff1a; https://docs.docker.com/ 2.1.常见命令 首先我们来学习Docker中的常见命令&#xff0c;可以参考官方文档&#…

小程序商城哪个平台好,码云数智,有赞,微盟对比2026 - 码云数智

许多企业想做小程序,却被高昂的开发成本和漫长的周期劝退。别让技术门槛成为你的绊脚石!SaaS 小程序制作平台专为解决这些难题而生,它用 “零代码” 的方式,让你像搭积木一样搭建商城。无需高薪聘请技术团队,几天…

步进电机驱动器:MCU + 分离元器件低成本驱动57步进电机全方案

目录 一、 核心设计原理 1. 分离式驱动器的核心逻辑 2. 关键技术原理 二、 硬件设计方案 1. 核心元器件选型&#xff08;适配 57 步进电机&#xff09; 2. 硬件电路设计&#xff08;两相 H 桥&#xff09; &#xff08;1&#xff09; 单路 H 桥电路&#xff08;A 相 / B…

SpringBoot Mocktio 单测 Mock Mapper

` @ExtendWith(MockitoExtension.class) class XxxxTeset { @InjectMocks private XxxService service = new XxxService(); @Mock private XxxMapper xxxMapper; @Mock private XxxDao xxxDao; @BeforeEach public vo…

用豆包/Kimi写论文的同学注意了,这款降AI工具救了我

用豆包/Kimi写论文的同学注意了&#xff0c;这款降AI工具救了我 TL;DR&#xff1a;用豆包、Kimi辅助写论文很方便&#xff0c;但直接交稿AI率肯定爆表。本文分享我用嘎嘎降AI处理豆包论文的经历&#xff0c;AI率从92%降到11%&#xff0c;3分钟搞定&#xff0c;救了我的毕业论文…

小程序制作平台哪个好?2026拖拽式小程序制作平台推荐 - 码云数智

针对零基础用户及中小商家,无代码小程序制作平台提供高效搭建解决方案。通过可视化拖拽编辑界面,实现按钮、图片、表单等组件的灵活布局,简化页面开发流程;平台内置商品管理、订单管控、会员体系等标准化功能模块,…

2026年降AI率工具哪家强?实测10款后,比话让我惊了

2026年降AI率工具哪家强&#xff1f;实测10款后&#xff0c;比话让我惊了 TL;DR 2026年知网AIGC检测算法升级&#xff0c;很多同学论文AI率飙升。我实测了10款降AI工具&#xff0c;比话降AI凭借Pallas引擎深度改写&#xff0c;把我39%的AI率直接降到0%&#xff0c;效果远超预…

给零基础者的AI大模型技术演进指南:从“一句话吩咐”到“智能工作流”

给零基础者的AI大模型技术演进指南&#xff1a;从“一句话吩咐”到“智能工作流” 1. 核心演进主线&#xff1a;从“听话”到“办事”&#xff0c;再到“协作” 想象一下&#xff0c;你最开始和一个非常聪明但“手无缚鸡之力”的助手一起工作。演进的核心&#xff0c;就是让这个…

BMAD x Superpowers 深度融合

适用对象: 资深软件架构师、技术总监、AI 工程化专家 核心哲学: 将软件工程的“设计权”与“执行权”分离&#xff0c;通过协议与工具链实现高精度的 AI 协作。&#x1f4d6; 第一篇&#xff1a;理论基础与核心哲学 (The Theoretical Framework) 1.1 现代 AI 编程的“不可能三角…

小程序开发一个多少钱啊?2026年小程序开发方式及费用 - 码云数智

小程序制作需要多少钱?2026年开发方式及费用全解析 在数字化浪潮席卷各行各业的2026年,小程序已成为企业连接用户、拓展业务的重要工具。面对市场上琳琅满目的开发平台,如何选择适合自己的开发方式并合理控制成本,…

如何将 Power Apps 嵌入到 Teams

前言好多人会在手机端使用Power Apps,尤其是画布应用,不过,手机端的app的用户体验,真的是一言难尽啊。正文1.首先得有这么一个应用,如下图:2.在应用列表里,找到"Add to Teams",如下图:3.继续点击&q…