当前位置: 首页 > news >正文

【数据结构---并查集】(并查集的原理,实现与应用)

并查集

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

一.并查集的原理

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

例如:有十个小朋友,他们两两之间可能存在直接的朋友关系,现在需要判断其中任意两个人是否是朋友(因为朋友的朋友也是朋友,所以不一定是直接的朋友关系
现给这些小朋友进行编号:{0, 1, 2, 3,4, 5, 6, 7, 8, 9};给以下数组用来存储该小集体
在这里插入图片描述
集合的树形表示:
在这里插入图片描述
从图中可以看出1,2,4,7是一组朋友,3,5,8是第二组,6,9,10是第三组,因此我们可以这样表示这些集合:
在这里插入图片描述
如果数组中的值为-1,表示这个节点就是这个集合的根,大于0则指向他的父节点。

通过上面这个例子,可以看出并查集适合解决这些问题:

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

二.并查集的实现

#include <iostream>
#include <vector>template <class T>
class UnionFindSet
{
public:UnionFindSet(size_t n): _ufs(n, -1){}// 查找index在哪个集合中void FindRoot(int index){int root = index;while(_ufs[root] >= 0){root = _ufs[root];}return root;}// 合并两个集合bool Union(int x,int y){int root1 = FindRoot(x);int root2 = FindRoot(y);if(root1 == root2)return false;_ufs[root1] += _ufs[root2];_ufs[root2] = root1;return true;}// 获取集合个数size_t Count(){size_t cnt = 0;for(auto &e : _ufs){if(e < 0){++cnt;}}return cnt;}private:std::vector<int> _ufs;
};

三.并查集的应用

1.省份数量

链接: 力扣

int FindRoot(vector<int>& ufs,int x)
{int root = x;while(ufs[root] >= 0){root = ufs[root];}return root;
}class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int n = isConnected.size();vector<int> ufs(n,-1);for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(isConnected[i][j] == 1){int root1 = FindRoot(ufs,i);int root2 = FindRoot(ufs,j);if(root1 == root2){continue;}ufs[root1] += ufs[root2];ufs[root2] = root1;}}}int n = 0;for(auto &e:ufs){if(e < 0){++n;}}return n;}   
};

2. 等式方程的可满足性

链接: 力扣

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

文章转载自:

http://IvQdNNw0.Lkxzb.cn
http://kMUEAmbz.Lkxzb.cn
http://W3ORX1UE.Lkxzb.cn
http://7WVQocLg.Lkxzb.cn
http://WBBPn2Gt.Lkxzb.cn
http://KvJalDK3.Lkxzb.cn
http://LZOowo8E.Lkxzb.cn
http://RA9EgozS.Lkxzb.cn
http://AjjWlfig.Lkxzb.cn
http://7dpfKK3h.Lkxzb.cn
http://YpY31Y2v.Lkxzb.cn
http://rR8cfsiz.Lkxzb.cn
http://4FlAXgYi.Lkxzb.cn
http://Tt7yErjq.Lkxzb.cn
http://DhhYNmrK.Lkxzb.cn
http://8CV76lpN.Lkxzb.cn
http://ygnV3ogr.Lkxzb.cn
http://m71j2Gkb.Lkxzb.cn
http://dfxHOkWT.Lkxzb.cn
http://3mLWqXdr.Lkxzb.cn
http://6kLTK3BC.Lkxzb.cn
http://5VYGrdoF.Lkxzb.cn
http://ovMG0FX9.Lkxzb.cn
http://aonaz1cd.Lkxzb.cn
http://AukaNo90.Lkxzb.cn
http://jqlaJGcx.Lkxzb.cn
http://L7IkoFRv.Lkxzb.cn
http://UefBXgo3.Lkxzb.cn
http://G3WuWKJd.Lkxzb.cn
http://8taTwQOo.Lkxzb.cn
http://www.dtcms.com/a/387568.html

相关文章:

  • 【数据结构-KMP算法(学习篇)】
  • Start application catch exception
  • 机器视觉在半导体封装检测中的应用
  • 雅菲奥朗SRE知识墙分享(九):『变更管理的定义与实践』
  • 51c视觉~3D~合集6
  • webRTC 的协议族
  • 线激光相机 眼在手上六轴机器人手眼标定 备忘记录
  • QML学习笔记(一)基本了解和工程配置
  • 大数据毕业设计选题推荐-基于大数据的牛油果数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Hadoop单机模式下运行grep实例,output文件目录不存在
  • 【docker】清理中断构建后产生的镜像和缓存
  • Vue2项目集成打包分析工具webpack-bundle-analyzer
  • 【阶梯波发生器如何控制电压和周期】2022-12-9
  • Java 设计模式之桥接模式(Bridge Pattern)
  • Android 端启动 HTTP 服务:从基础实现到实战应用
  • 《2D横版平台跳跃游戏中角色二段跳失效与碰撞体穿透的耦合性Bug解析》
  • 基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案
  • OpenCV 风格迁移、DNN模块 案例解析及实现
  • php实现火山引擎 【双向流式websocket-V3-支持复刻2.0/混音mix】开箱即用,可用于各种PHP框架。
  • 【lua】Windows环境下cffi-lua使用指南:编译、安装与测试
  • 我优化了昨天的C++/Lua插件系统:添加了插件沙箱、Lua 状态池
  • 【数据库】SQLite安装部署与使用指南
  • Android Kotlin 请求方法代码
  • 【easy_tools】一个跨平台裸机工具库,包含任务/堆栈/消息/定时器/日志等实现
  • ARM(11) - LM75
  • FPGA实现SRIO数据回环传输,基于Serial Rapidlo Gen2架构,提供6套工程源码和技术支持
  • 第十九章 Arm C1-Premium TRBE技术解析
  • HTB writeup
  • 科学研究系统性思维的理论基础:数字化研究工具
  • 基于有限元-元胞自动机法(CAFE)的增材制造过程组织模拟