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个元素的数组,然后我们可以先遍历一遍数组,将相等的值放到一个集合里面,然后再遍历一遍数组,查看不相等的字符串,如果不相等的字符串也在同一个集合,那么这就是相悖的。
在这里插入图片描述

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

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

相关文章

机器视觉检测技术是什么?突出的亮点有哪些?

机器视觉检测技术是一种利用图像处理软件分析处理相机捕捉到的图像,以替代人眼在制造和测试过程中进行检测和测量的技术。它广泛应用于工业自动化领域,可以提高生产效率和质量控制的精度。机器视觉系统通常包括光源、相机、图像处理单元和执行机构等组成…

如何链接多个modbus_tcp设备,并将设备数据写入同一个modbusSlave,以便外部客户端获取所有链接设备的数据。

在modbus通信中,一个modbus服务器一次只能链接一个客户机,那么,外部客户端要获取多个设备的modbus数据,就需要使用链接一个专用的mosbus服务器,一下就是详细解决方法。 第一步:创建modbus客户端&#xff0…

组合总数 python

‘’已知—个无重复元素的序列,给定—个目标数,找出序列中所有可以使数字和未目标数的组合。 序列中的元素可以被多次选用,不能出现重复的组合, 序列中的元素和目标数都是正整数。 例如序列 [2, 3, 5], 目标值为8, 最终的组合有 (2, 3, 3&am…

nvm基本使用

nvm基本使用 文章目录 nvm基本使用1.基本介绍2.下载地址3.常用指令 1.基本介绍 NVM是一个用于管理 Node.js 版本的工具。它允许您在同一台计算机上同时安装和管理多个 Node.js 版本,针对于不同的项目可能需要不同版本的 Node.js 运行环境。 NVM 主要功能&#xff…

嵌入式学习——C语言基础——day10

1. 指针的基本概念 1.1 地址 用来区别不同内存字节空间的编号 1.2 指针 地址就是指针,指针就是地址,地址是一个编号,指针多了指向的概念 1.3 指针变量 用来存放指针的变量,有时将指针变量简称为指针 2. 指针相关运算符 & …

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

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

001 rabbitmq减库存demo direct

文章目录 ProducerConsumerRabbitMQDirectConfig.javaapplication.yamlServletInitializer.javaRabbitmqApplication.javapom.xml“该消息已经准备好再次被消费”和“队列已经准备好重新分发该消息” Producer 这段代码定义了一个名为Producer的RESTful Web服务Controller&…

iOS(Object C) 插入排序

插入排序的思想: 可以想象你在打牌,手里有一张牌2, 第一次摸到一张牌5; 5 比1 大,所以摸到的牌5放在1的右边; (此时手里的牌为 2->5) 第二次摸到一张牌3; 3比5小,所以3和5互换位置,再拿3和2比,3比2大,3不动(此时手里的牌为 2-> 3 -> 5) 第三次摸到一张牌1,1比5小,…

Windows10系统安装IIS的步骤

在Windows 10上安装IIS的步骤如下:12 打开控制面板,选择“程序”或“程序和功能”。点击“启用或关闭Windows功能”。在列表中找到“Internet Information Services”,勾选该选项。根据需要勾选IIS的具体组件,如万维网服务、IIS可…

创新指南 | 2024年企业如何十步打造最佳的数字化营销策略组合

营销是一个动态且不断变化的领域。顶级的数字营销策略随着消费者和技术趋势的变化而变化。这就是为什么每个公司都需要一个经过良好规划并具有明确里程碑和目标的营销策略。一旦你有了正确的计划,你实现为业务设定的目标的可能性就会大大增加。这意味着,…

面试经典150题——求根节点到叶节点数字之和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一——DFS 理解问题: 首先要理解题目的要求,即对于给定的二叉树,我们需要找出从根节点到所有叶子节点的所有路径,然后将每一条路径上的数字组成一个整数,最后求出这些整数…

k8s部署prometheus

部署pvc 修改nfs-deployment.yaml文件中的信息&#xff0c;然后应用YAML文件 cat > /opt/k8s/prometheus/prometheus-pvc.yaml <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata:name: prometheus-data-pvc spec:accessModes:- ReadWriteManystorageClas…

京东天幕,宙斯,云鼎什么关系

京东云鼎是京东云推出的一站式零售应用云计算平台&#xff0c;为商家、品牌商及合作伙伴与京东无界赋能的商业赋能、业务赋能、品牌赋能等服务集成&#xff0c;提供弹性的云计算资源、可靠的安全服务、高效的数据推送服务、标准化的网关服务&#xff0c;并优先享受京东的云端生…

手把手教数据结构与算法:栈的应用(平衡符号和简单计算器)

栈 基本概念 栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许进行插入删除的那一端…

@Value

Value 注解是 Spring 框架中的一个注解&#xff0c;用于从属性文件、环境变量、Java 系统属性等地方读取值&#xff0c;并将这些值注入到 Spring 管理的 Bean 中。 Component public class MyBean {Value("${my.property}")private String myProperty;// Getter and…

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

debian gnome-desktop GUI(图形用户界面)系统

目录 &#x1f31e;更新 &#x1f3a8;安装 &#x1f34e;分配 &#x1f6cb;️重启 &#x1f511;通过VNC连接 debian gnome-desktop &#x1f31e;更新 sudo apt update sudo apt -y upgrade &#x1f3a8;安装 sudo apt -y install task-gnome-desktop 这个过程比…

前端发版缓存问题

前端发版后浏览器缓存问题 浏览器缓存机制是为了提高网页加载速度和减少带宽消耗而设计的。当浏览器访问一个资源时&#xff0c;它会首先检查该资源是否已经在缓存中。如果资源存在且未过期&#xff0c;浏览器会直接从缓存中加载资源&#xff0c;而不会向服务器发送请求。这种…

pytest-asyncio:协程异步测试案例

简介&#xff1a;pytest-asyncio是一个pytest插件。它便于测试使用异步库的代码。具体来说&#xff0c;pytest-asyncio提供了对作为测试函数的协同程序的支持。这允许用户在测试中等待代码。 历史攻略&#xff1a; asyncio并发访问websocket Python&#xff1a;协程 - 快速创…

ROS1快速入门学习笔记 - 06订阅者Subscriber的实现

一、话题模型&#xff08;发布/订阅&#xff09; 二、 实现步骤 与发布者步骤类似&#xff0c;我们将发布者的对应代码写入功能包的src文件中。 1. C程序代码 /*********************************************************************** Copyright 2020 GuYueHome (www.guyu…