c++并查集

文章目录

  • 前言
  • 一、并查集
    • 1、并查集原理
    • 2、并查集实现
    • 3、并查集应用
      • 1.省份数量
      • 2.等式方程的可满足性


前言


一、并查集

1、并查集原理

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

例如某公司今年校招共招10个人,北京招4人,河南招3人,西安招3人,10个人来自不同的学校,刚开始互相都不认识,所以每个人都是一个独立的小团体,我们给这些人进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};然后我们使用下面的数组来存储该小集合。数组中存的-1中的1表示现在每个团体中都只有1个人,负号表示这个人就是这个团体的根结点。
在这里插入图片描述
毕业后,学生们要去公司上班,每个地方的学生自发组织成小队一起上路,于是北京学生小分队S1={0, 6, 7, 8},河南小分队S2={1, 4, 9},西安小分队S3={2, 3, 5},这时10个人就形成了3个小团体。假设三个队长由0,1,2担任。下面为集合的树形表示。
在这里插入图片描述
下面为S1、S2、S3集合使用数组表示。可以看到北京的队长为0,所以数组中下标为0的空间中存储了-4,4表示S1这个集合有4个人,负号表示编号为0的同学是树的根结点,即队长。而数组中下标为6,7,8的空间中存了0,这存储的是6,7,8的父结点的下标0,即表示编号为6,7,8的同学的队长为0。S2和S3集合在数组中的存储也同理。
在这里插入图片描述
仔细观察数组,可以得出以下结论:

  1. 数组的下标对应集合中元素的编号。
  2. 数组中如果为负数,负号代表根,数字代表该集合中元素个数。
  3. 数组中如果为非负数,代表该元素双亲在数组中的下标。

在公司工作一段时间后,北京小分队中8号同学与河南小分队1号同学奇迹般的走到了一起,两个小圈子的学生相互介绍,最后成为了一个小圈子。此时就相当于S1和S2集合合并了,下面为合并后集合的树形表示。
在这里插入图片描述
下面为集合在数组中的表示。现在0集合有7个人,2集合有3个人,总共两个朋友圈。
在这里插入图片描述

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

  1. 查找元素属于哪个集合
    沿着数组表示树形关系向上一直找到根。(即:树中元素为负数的位置)
  2. 查看两个元素是否属于同一个集合
    沿着数组表示的树形关系向上一直找到树的根,如果根相同表明在同一个集合,否则不在。
  3. 将两个集合归并成一个集合
    将两个集合中的元素合并。
    将一个集合名称改成另一个集合的名称。
  4. 集合的个数
    遍历数组,数组中元素为负数的个数即为集合的个数。

2、并查集实现

下面我们来简单实现一个并查集。
在这里插入图片描述
下面实现返回元素根结点的函数。
在这里插入图片描述
下面再来实现合并集合的函数。
在这里插入图片描述
下面再来实现判断两个元素在同一集合,查看集合数的函数。这样我们就实现了一个简单的并查集。
在这里插入图片描述

3、并查集应用

1.省份数量

题目链接:省份数量
在这里插入图片描述
这个题目我们可以使用并查集来解决,即相连的城市就表示在同一个集合,这样最后只需要知道并查集中有多少集合,就知道了省份的数量。我们先将上面实现的并查集放到题目中。
在这里插入图片描述
然后我们创建一个并查集,遍历矩阵,并且将相连的城市作为同一个集合,进行合并。
在这里插入图片描述
上面我们使用到了一个并查集,那么写这个题之前就需要实现一个并查集,这样是很麻烦的,所以下面我们不使用并查集来做这一题。
在这里插入图片描述

2.等式方程的可满足性

题目链接:等式方程的可满足性
在这里插入图片描述
这个题目我们也可以使用并查集的思想来实现,我们可以创建一个可以存26个元素的数组,然后我们可以先遍历一遍数组,将相等的值放到一个集合里面,然后再遍历一遍数组,查看不相等的字符串,如果不相等的字符串也在同一个集合,那么这就是相悖的。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应急行业的智能安全帽(高端)

前面介绍了低端、中端安全帽,接着再讲讲高端安全帽。做高端安全帽的企业非常少,估计一只手都数的出来。确实也和智能安全帽这个领域体量有关系,并且他有一个新的“劲敌”——智能眼镜从其他领域瓜分原属于他的市场,这些都是题外话…

SpringBoot引入Layui样式总是出现404

一般出现Layui样式文件如css,js404的错误 解决方案 (1)首先将其中的静态资源下载resources/static中 (2)在启动类中重写方法 package com.gq.booksystem;import org.mybatis.spring.annotation.MapperScan; import …

【ETAS CP AUTOSAR工具链】RTE层基本概念与开发流程

本篇文章续接上篇文章【ETAS CP AUTOSAR工具链】基本概念与开发流程,继续按上篇文章描述的ETAS CP工具链进行开发的基本框架,讲述了“RTE集成与配置”这部分的基本概念与开发流程。 RTE(Runtime Environment)处于应用层与基础软件…

【Godot4.2】自定义Todo清单类 - myTodoList

概述 在写myList类的时候,就想到可以写一个类似的Todo清单类。 基础思路 本质还是在内部维护一个数组,在其基础上进行增删改查操作的封装为了方便存储数据,编写一个自定义内置类TodoItem,内部数组就变成了Array[TodoItem]类型的…

Git | 远程操作

Git | 远程操作 文章目录 Git | 远程操作0、分布式版本控制系统概念1、创建远程仓库2、克隆远程仓库https方式ssh方式 3、推送至远程仓库4、本地拉取远程仓库5、配置Git忽略特殊文件给命令配置别名 6、标签管理创建标签操作标签 0、分布式版本控制系统概念 Git是一个分布式版本…

Git--分布式版本控制系统

目录 一、理解分布式版本控制系统二、远程仓库三、克隆远程仓库四、向远程仓库推送五、拉取远程仓库六、配置Git七、给命令配置别名八、创建标签九、操作标签 一、理解分布式版本控制系统 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等&a…

24深圳杯AC题完整思路+可执行代码+参考论文!!!!

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的,大家可以参考我往期的资料,所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意:(建议先下单占坑,因为随着后续我们更新资料数…

three.js 学习笔记 | 光线投射技术 - 包围盒(碰撞检测)

文章目录 three.js 学习笔记光线投射技术实现3D场景交互事件 THREE.Raycaster坐标系的转换案例:选中的模型变为红色 包围盒Box3 - 碰撞检测AABB包围盒辅助器Box3Helper案例1:创建AABB包围盒/包围球computeBoundingBox与boundingBox 搭配使用,…

【数据结构】二叉树(带图详解)

文章目录 1.树的概念1.2 树的结构孩子表示法孩子兄弟表示法 1.3 相关概念 2.二叉树的概念及结构2.1 二叉树的概念2.2 数据结构中的二叉树-五种形态2.3 特殊的二叉树2.4 二叉树的存储结构顺序存储链式存储 2.5 二叉树的性质 3. 堆3.1 堆的定义3.2 堆的实现堆的结构堆的插入向上调…

springcloud按版本发布微服务达到不停机更新的效果

本文基于以下环境完成 spring-boot 2.3.2.RELEASEspring-cloud Hoxton.SR9spring-cloud-alibaba 2.2.6.RELEASEspring-cloud-starter-gateway 2.2.6.RELEASEspring-cloud-starter-loadbalancer 2.2.6.RELEASEnacos 2.0.3 一、思路 实现思路: 前端项目在请求后端接…

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

手写文本识别系统的最佳实践

手写文本识别系统的最佳实践 摘要IntroductionRelated WorkProposed HTR SystemConvolutional Backbone:Flattening Operation:Recurrent Head:CTC shortcut: Best Practices for a Handwritten Text Recognition System 摘要 手写文本识别在近年来随着深度学习及其应用的兴起…

文件夹惊变文件?揭秘原因及解决方案

在日常工作和生活中&#xff0c;电脑已经成为我们不可或缺的助手。然而&#xff0c;有时我们会遇到一些令人困惑的问题&#xff0c;比如&#xff0c;文件夹突然变成了文件。这听起来可能有些匪夷所思&#xff0c;但它确实会发生&#xff0c;而且给用户带来了不小的麻烦。当熟悉…

java-spring-mvc(知识点讲解-第一天)-欢迎各位大佬提建议

目录 &#x1f383;MVC定义 &#x1f9e8;创建工程 &#x1f3a8;SpringMVC处理请求 请求分类及处理方式 静态请求 处理静态前端页面方式 动态请求 处理动态前端页面方式 ⚙小试牛刀 &#x1f3c6;常见问题 &#x1f4cc;HTTP协议 超文本传输协议 请求 &#x1f383;MVC…

Web前端开发 小实训(二) 简易计算器

实训目的 学生能够使用函数完成简易计算器编写 操作步骤 1、请将加减乘除四个方法生成为以下函数&#xff0c;且有返回值 中文英语加法add减法subtract乘法multi除法division次幂pow()平方根sqrt() 提示&#xff1a; 除法中的除数不能为0&#xff01; 参考代码&#xff1…

在线培训考试系统在线考试功能注意事项

在线培训考试系统在线考试功能注意事项 考试前务必注意是否开启防切屏、摄像头监考等防作弊措施&#xff0c;系统一旦检测到触发了疑似作弊行为会立刻自动交卷&#xff0c;考试终止&#xff1b; 答题者准备好后&#xff0c;可点击“开始答题”按钮进入考试&#xff0c;注意考…

代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1_哔哩哔哩_bilibili 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一…

#C++里的引用#

目录 引用概念 定义引用类型 引用特性 常引用 传引用传参 传引用做返回值 1.引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 比如&#xff1a…

【AI】一文介绍索引增强生成RAG的原理和结构

今天向大家介绍一下关于RAG的一些知识和经验。 这里说的RAG可以理解为目前针对企业知识库问答等AI应用场景的解决方案,这个场景就是利用自然语言大模型LLM与用户自有的文件进行对话的能力。 【RAG的优势】 首先,讲一讲RAG的优势特征。 如果把AI想象成一个待上岗的人类助手,…