并查集(C++)

目录

  • 一、并查集的原理
  • 二、并查集的实现
      • 路径压缩
  • 三、并查集的应用
  • 结尾

一、并查集的原理

并查集的两个功能:

  • 合并:合并两个不想联系的元素
  • 查询:判断两个元素是否在同一个组内

主要解决的是元素分组的问题。


例如:某班级要创建三个兴趣小组,分别是象棋、游泳、篮球。
班级总人数10人,现在需要不10人分别添加到三个兴趣小组中,每个人只能参加一个兴趣小组。

象棋小组:{2,4,6,7}
游泳小组:{0,1,5,8}
篮球小组:{3,9}

这里就可以使用到并查集。
在这里插入图片描述
在数组中的表示:

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

在这里插入图片描述


例如:由于篮球小组人比较少,某班级决定解散,成员合并到游泳小组。
在这里插入图片描述

  1. 数组0下标的数据变为-6
  2. 数组3下标的数据变为8

二、并查集的实现

代码实现

1.使用vector容器
2.实现合并功能(一个节点只能附属一个根节点)
3.实现查询功能(判断两个节点的根节点是否相同)
#pragma once
#include<iostream>
#include<vector>
using namespace std;
template<class T>
class UnionFindSet {
public:UnionFindSet(const size_t n):UFS(n,-1){}//合并查集void UnionSet(const int x,const int y){int root1 = FindRoot(x);int root2 = FindRoot(y);if (root1 != root2){//合并:控制数量少的往控制数量大的合并(合并意味着层数多了一层)if (abs(UFS[root1]) < abs(UFS[root2]))swap(root1, root2);UFS[root1] += UFS[root2];UFS[root2] = root1;}}//寻找节点的根int FindRoot(int index){int temp = index;while (UFS[index] >= 0){index = UFS[index];}//子树全部去直接连接根(路径压缩)while (UFS[temp] >= 0){int next = UFS[temp];UFS[temp] = index;temp = next;}return index;}	//计数森林的个数int CountSet(){int count = 0;for (auto n: UFS){if (n < 0)++count;}return count;}
private:vector<T> UFS;
};

路径压缩

1、数量少的森林往数量多的森林合并。(在合并的时候进行优化)
数量多的森林往往代表的查询频率多,如果往数量少的森林上合并,就会使原有的层数+1,提高了查询的成本。
2、子节点全部直接和根节点联系,降低森林的层数。(在查询的时候进行优化)

三、并查集的应用

题1:省份问题
题2:等式方程的可满足性

题1思路:

  • 矩阵的横、纵坐标代表这省份之间的联系,1代表联系需要合并,0代表不联系不需要合并。
  • 最后计算森林的数量

题2思路:

  • 建立字母和数组下标映射关系
  • 合并==的两个字母
  • 最后查询!=的两个字母是否有相同的根,有相同的根则false

结尾

不定期更新,给小编点点赞,为小编加加油,点赞➕收藏不迷路噢~❤️
请添加图片描述

下一篇:讲解图。

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

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

相关文章

求实创新 不断探索 浙江移动基于亚信科技AntDB数据库率先完成CRM系统全域改造

12日20日&#xff0c;中国信息通信研究院&#xff08;简称&#xff1a;信通院&#xff09;和中国通信标准化协会大数据库技术推进委员会&#xff08;CCSA TC601&#xff09;共同组织的2023年大数据库“星河&#xff08;Galaxy&#xff09;”案例评选结果发布。中国移动通信集团…

驱动芯片,预计未来几年将达到605亿美元的规模

驱动芯片是指驱动显示屏幕幕的芯片&#xff0c;其应用广泛&#xff0c;主要用于电脑、手机、电视、平板电脑和汽车等设备。全球驱动芯片市场分析&#xff1a; 据市场研究预测&#xff0c;未来几年内&#xff0c;全球驱动芯片市场将保持稳定增长&#xff0c;并达到605亿美元的规…

leaflet呼吸闪烁效果

leaflet呼吸闪烁效果 1.功能背景 这个效果一把用于点击选中&#xff0c;报警提升效果。 2.功能开发 2.1 marker 这个效果还是很好实现&#xff0c;主要通过计时器设置透明度的组合实现。 function setTargetSelect(e){var i 1var int setInterval(() > {if(!e._map…

【EI会议征稿通知】第十届先进制造技术与应用材料国际学术会议(ICAMMT 2024)

第十届先进制造技术与应用材料国际学术会议&#xff08;ICAMMT 2024&#xff09; The 10th International Conference on Applied Materials and Manufacturing Technology 至今ICAMMT已连续举办九届&#xff0c;会议先后在三亚、杭州、清远等城市成功召开。每一届最终征集收…

rtsp解析视频流

这里先说一下 播放rtsp 视频流&#xff0c;尽量让后端转换一下其他格式的流进行播放。因为rtsp的流需要flash支持&#xff0c;现在很多浏览器不支持flash。 先说一下这里我没有用video-player插件&#xff0c;因为它需要用flash ,在一个是我下载flash后&#xff0c;还是无法播放…

JVM篇:直接内存

直接内存 直接内存并不是JVM的内存结构&#xff0c;直接内存是操作系统的内存&#xff0c;Java本身并不能对操作系统的内存进行操作&#xff0c;而是通过调用本地方法。直接内存常用于NIO作为缓冲区存在&#xff0c;分配成本较高但是读写性能好&#xff0c;并且不受JVM内存回收…

Linux下NUMA 内存管理初步理解

LINUX 系统在多核下,以及NUMA架构技术下 如何管理物理内存? 经过初步了解 发现系统对内存有以下工作 1 映射 2 内存碎片 3 内存回收 4 内存池 5 冷热页 6 水位线和保留内存 7 支持内存条热插拔 8 大页管理 这些功能给人感觉,尤其是DBA感觉是重新实现了数据缓存池的功…

如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题

1.查找国内访问比较快的IP 站长工具网址&#xff1a; https://tool.chinaz.com 测速链接: https://tool.chinaz.com/speedtest/github.com 输入 github.com 点击查看分析 往下滑动&#xff0c;找一个比较快的IP&#xff0c;然后去修改hosts配置文件 &#xff08;例如&#xff…

【JAVA】泛型和Object的区别

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 前言 在Java编程中&#xff0c;我们常常需要处理不同类型的数据&#xff0c;而泛型和Object是两种处理类型的主要机制。本文…

Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码

UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。 UWB&#xff08;超宽带&#xff09;高精度定位系统是一…

每日软测知识:自动化测试重运行是好是坏?

如果有人手动运行测试&#xff0c;那么他们会暂停并了解更多信息。但是&#xff0c;当自动测试失败时&#xff0c;其余部分可能会继续运行。在套件完成之前&#xff0c;你是没有办法看到测试报告的&#xff0c;并且自动化程序不会在故障时执行任何额外的操作尝试找出问题。当剩…