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


二、并查集实现
常用操作:
- 查找元素属于哪个集合 沿着数组表示树形关系以上一直找到根(即:树中中元素为负数的位置)
- 查看两个元素是否属于同一个集合 沿着数组表示的树形关系往上一直找到树的根,如果根相同表明在同一个集合,否则不在
- 将两个集合归并成一个集合 将两个集合中的元素合并 将一个集合名称改成另一个集合的名称
- 集合的个数 遍历数组,数组中元素为负数的个数即为集合的个数。
实现:
#include<iostream>
#include<vector>
#include<map>using namespace std;template<class V>
class UnionFindSet
{
public://初始化UnionFindSet(const vector<V> & element){int n = element.size();//初始化集合_ufs.resize(n, -1);//初始化映射关系_element.resize(n);for (int i = 0; i < n; i++){_element[i] = element[i];_indexmap[element[i]] = i;}}//获取下标int GetIndex(const V& v){//通过映射获取if (_indexmap.find(v) != _indexmap.end())return _indexmap[v];return -1;}// 给一个元素的编号,找到该元素所在集合的名称int FindRoot(int index){//父下标为负数代表是该集合的根节点int root = index;while (_ufs[root] >= 0){//迭代root = _ufs[root];}//路径压缩 -- 将index -> 根上的点都连接到根节点上while(_ufs[index] > 0){int p = _ufs[index];_ufs[index] = root; //改变父下标index = p;}return root;}//将两个元素合拼到同一个集合里bool Union(V v1, V v2){//获取下标int x1 = GetIndex(v1);int x2 = GetIndex(v2);//获取两个元素的根节点下标int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 == root2)return false;//小的并到大的里面 -- 减少路径长度if(abs(_ufs[root1]) < abs(_ufs[root2]))swap(root1,root2);//连接_ufs[root1] += _ufs[root2]; //每一个元素的下标初始为-1,根节点下标的绝对值代表这个集合元素个数_ufs[root2] = root1;return true;}// 数组中负数的个数,即为集合的个数size_t Count()const{//遍历+统计size_t ret = 0;for (int i = 0; i < _ufs.size(); i++){if (_ufs[i] < 0)ret++;}return ret;}private:map<V, int> _indexmap; //通过元素找到映射的下标vector<V> _element; //通过下标找到映射的元素vector<int> _ufs; //集合
};
三、并查集的应用
使用并查集解决下面题目:
题目:省份数量

使用算法:并查集
将相连的城市放到一个集合里,最后统计集合的个数即可。
代码:
并查集代码
//
class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {//创建集合vector<int> v;for(int i = 0; i < n; i++)v.push_back(i);UnionFindSet<int> ufs(v);//遍历二维数组for(int i = 0; i < isConnected.size(); i++){for(int j = 0; j < isConnected[i].size(); j++){//相连进入一个集合if(isConnected[i][j] == 1){ufs.Union(i,j);}}}//返回集合数量return ufs.Count();}
};
但是在实际写题中手写一个并查集很浪费时间,所以一般提取核心思想部分融入我们的代码中,如使用一个数组模拟。
class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) { int n = isConnected.size();//模拟并查集vector<int> _ufs(n,-1);// 给一个元素的编号,找到该元素所在集合的名称auto FindRoot = [&_ufs](int index){int n = index;while (_ufs[n] >= 0){n = _ufs[n];}return n;};for(int i = 0; i < n; i++){for(int j = 0; j < isConnected[i].size(); j++){//i j 相连if(isConnected[i][j] == 1){//查找i,j集合的根节点下标int root1 = FindRoot(i);int root2 = FindRoot(j);//不在一个集合,进行合并if(root1 != root2){_ufs[root1] += _ufs[root2];_ufs[root2] = root1; }}}}//遍历,负数说明是一个集合的int ret = 0;for(int i = 0; i < n; i++){if(_ufs[i] < 0)ret++;}return ret;}
};
相关文章:
数据结构 - 并查集
文章目录 一、并查集原理二、并查集实现三、并查集的应用 一、并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复…...
canvas基础+应用+实例
文章目录 Canvas基础知识要点一、基本概念二、常用参数三、实例四、场景应用说明完结 Canvas基础知识要点 一、基本概念 Canvas是HTML5中的一个标签,用于在网页上通过JavaScript绘制图形、动画等。它提供了一个空白的、基于像素的绘图区域,就像一块画布…...
Linux命令 用户操作简介
目录 1. 添加新的用户账号 2. 删除用户账号 3. 修改用户账号 4. 用户口令的管理 示例汇总 添加新用户 删除用户 修改用户信息 更改用户口令 在 Linux 系统中,用户管理是一项重要的任务,包括添加新用户、删除用户、修改用户信息以及管理用户口令…...
大语言模型的Scaling Law【Power Low】
NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 四、大语言模型的Scaling Law【Power Low】 文章目录 NLP-大语言模型学习系列目录一、什么是…...
windows环境下,使用docker搭建redis集群
参考: https://blog.csdn.net/weixin_46594796/article/details/137864842 https://www.cnblogs.com/niceyoo/p/14118146.html 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会-腾讯云开发者社区-腾讯云 一、基础环境描述 宿主机:192.168…...
Python(pandas库3)
函数 随机抽样 语法: n:要抽取的行数 frac:抽取的比例,比如 frac0.5,代表抽取总体数据的50% axis:示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例: 输出结果都为随机抽取。 空…...
WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装
文章目录 1、运行效果1、封装用户控件1、创建文件2、依赖属性实现2、使用封装的按钮控件1.主界面引用2.按钮属性设置3 总结1、运行效果 1、封装用户控件 1、创建文件 打开 Wpf_Examples 项目,在 UserControlLib 用户控件库中创建按钮文件 WaterRipplesButton.xaml ,修改 Us…...
数据结构————map,set详解
今天带来map和set的详解,保证大家分清楚 一,概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型,我们称之为<key-value>模型 set只能存储一个数据类型,我们称之为纯<key>模型 它们的效率都非…...
fdisk - Linux下的磁盘分区利器
文章目录 前言一、安装和启动二、基本命令2.1 查看分区表2.2 删除分区2.3 创建新分区2.4 更改分区类型2.5 其他指令 三、注意事项四、其他相关工具 前言 在Linux系统中,磁盘管理是维护系统性能和数据安全的重要环节。fdisk 是一个强大的命令行工具,专门…...
or-tools优化库记录
介绍 Or-tools是谷歌人工智能系列的运筹优化包,是一个用于优化的开源软件套件,针对性地解决车辆路线问题、流程优化、整数和线性规划以及约束规划等问题。 官网地使用说明比我详细,我就不多逼逼了 使用说明网址: https://develo…...
M1 Pro MacBook Pro 上的奇遇:Rust 构建失败,SIGKILL 惊魂记
你是否也曾在 M1 Pro MacBook Pro 上遇到过离奇的编译问题?这次我遇到的奇葩问题绝对值得一聊——一个仅在苹果M1 Pro上的神秘构建失败。其他设备都安然无恙,唯独它!折腾了一番,终于让我揭开了这“阴谋”的真相。 问题描述 在运…...
重构商业生态:DApp创新玩法与盈利模式的深度剖析
随着区块链技术的发展,DApp(去中心化应用)正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础,结合智能合约,逐步改变传统商业运作模式,创造新的市场生态。本文将从DApp的独特优势、创新玩法和…...
2024首届亚洲国际电影节圆满落下帷幕
10月26日下午,2024首届亚洲国际电影节颁奖典礼在中国•澳门隆重举行。在这座充满时尚感的“东亚文化之都”,一座座金鹮奖杯,汇聚起全球电影艺术的荣耀之光,见证着无数电影梦想的傲然绽放。明星云集欢聚一堂,同庆澳门回…...
【Mybatis】动态SQL+配置文件+数据库连接池+企业规范(10)
本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 目录 本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 …...
layui扩展组件之----右键菜单
源码:rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…...
ue5实现数字滚动增长
方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里...
Flink(一)
目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用? 典型的事件驱动示例 数据分析应用流式分析应用的优势?Flink 如…...
kaggle 数据集下载
文章目录 kaggle 数据集下载(1) 数据集下载(2) 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍,快忘得差不多了,惭愧。 参考了好多帖子,使用命令行…...
Linux shell编程学习笔记87:blkid命令——获取块设备信息
0 引言 在进行系统安全检测时,我们需要收集块设备的信息,这些可以通过blkid命令来获取。 1 blkid命令的安装 blkid命令是基于libblkid库的命令行工具,可以在大多数Linux发行版中使用。 如果你的Linux系统中没有安装blkid命令,…...
wireshark筛选条件整理
Wireshark筛选条件整理 一、MAC地址过滤二、IP地址过滤三、端口过滤四、协议筛选五、数据分析1、整体2、frame数据帧分析3、 Ethernet II 以太网4、IP协议5、TCP6、HTTP7、ARP8、DLEP动态链接交换协议 六、统计-协议分级(统计包占比) and && 、 …...
50 ubuntu22.04
联系IT,制作U盘启动盘 进BIOS关闭安全启动 格式化磁盘:https://blog.csdn.net/zhg2546179328/article/details/136223186 系统安装,并配置:https://blog.csdn.net/m0_75114321/article/details/155456810...
python的pyd本质:就是Windows平台下的DLL动态链接库
一、 拆解:Python 库的真实生态与 .pyd / .so 的底层逻辑1. Python 真的有百万个第三方 PIP 库吗?不准确。 截至2026年,PyPI(Python Package Index)官方注册的开源项目总量大约在 50万到60万个 之间。虽然达不到“百万…...
Steam协议逆向实战:NetHook2与SteamKit2协同分析
1. 这不是“抓包”,而是逆向理解Steam通信协议的起点很多人第一次听说“NetHook2 SteamKit2”组合时,下意识会把它等同于Wireshark抓HTTP流量——点开Steam客户端,随便点个好友头像,抓一堆TCP包,然后对着十六进制窗口…...
城市交通气候适应:从生物滞留池到透水铺装的工程实践
1. 项目概述:当城市交通遇上极端天气干了十几年市政工程,我越来越觉得,现在的城市交通系统就像个“玻璃人”——看着钢筋铁骨,实则脆弱得很。一场暴雨,主干道就能变成“主干河”;连续高温,沥青路…...
H3CSE 高性能园区网:生成树保护机制
H3CSE 高性能园区网:生成树保护机制一、生成树保护机制1. BPDU保护1.1 边缘端口特点及问题端口基础特性存在的安全隐患1.2 BPDU保护机制核心防护逻辑机制运行优势1.3 BPDU保护配置配置使用规范H3C设备配置命令2. 根桥保护2.1 根桥保护机制2.2 根桥保护配置要求2.3 根…...
Python之anonymate包语法、参数和实际应用案例
一、AnonyMate 包概述 AnonyMate是 Python 第三方数据匿名化工具包,版本 0.1.5,专注结构化/非结构化数据脱敏、假名化、加密与合成数据生成,适配医疗、金融、电商等敏感数据场景,助力合规(GDPR、等保2.0)。…...
迁移学习提升可穿戴设备睡眠监测精度的技术解析
1. 项目概述:迁移学习如何提升可穿戴设备的睡眠监测精度作为一名长期关注健康监测技术的从业者,我见证了可穿戴设备在睡眠监测领域的快速发展。但一个核心痛点始终存在:基于PPG(光电容积图)等外周生理信号的可穿戴设备…...
从选刊到综述:GPT到底在学术写作上升级了什么?
各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 导师把选题报告打回来,批注栏里写着:“创新点不够清晰,建议重新梳理研…...
Unity+C#开发MMO服务端的务实架构与万人连接实战
1. 先泼一盆冷水:所谓“万人同时在线”的真实含义与常见误解 很多人看到“UnityC#开发万人MMO服务器”这个标题,第一反应是:哇,这得用多牛的分布式架构?是不是要上Kubernetes集群、分库分表、消息中间件全配齐…...
TI MSPM0G3105-Q1汽车MCU实战解析:从核心特性到硬件设计
1. 项目概述:为什么是MSPM0G3105-Q1?在汽车电子和工业控制领域摸爬滚打十几年,我经手过的MCU型号少说也有几十款。每次启动一个新项目,选型都是头等大事,它直接决定了后续开发的难易度、系统的稳定性和最终产品的成本。…...
