c++高级数据结构之并查集

发布时间:2026/9/27 15:01:05

c++高级数据结构之并查集
一.相关原理1.概念首先我们得明晰并查集在图形层面是什么——一片森林也就是很多个不相交的集合(很多棵树)。2.表示方式像堆那样用数组存储每一个人:一开始给这些学生编好号数组下标就是他们对应的编号。一段时间后大家熟络组成不同小群体编号012的同学担任队长这些同学间产生了联系。以上的三棵树就可以说是一个并查集(森林)。这是形成森林后的存储情况。结论:注:一开始的数组中数组元素要均为-1。因此存储用的是双亲表示法数组中的元素可根据正负区分出谁是父亲谁是孩子。数组元素为负数负号代表父节点其绝对值代表整棵树(集合)节点的数量数组元素为非负数代表子节点且元素的值代表该子节点所在树的根节点的下标。数组下标表示每个节点的编号。3.如何合并两棵树需要去合并两棵树的根节点在存储中的操作以下图为例1合并到0上就是将1对应的值-3加给0对应的值-4随后1对应的值变成0此刻的1不再是大哥转而做了0的小弟。合并后的示意图:二.并查集的实现在理解实现之前如果对map的重载[]不太熟悉的读者可参考笔者这篇文章cpp数据结构之map1.给人名建立人与编号的映射关系代码:#pragma once #includemap//利用map和set做到根据编号找人人找编号的映射关系。 #includevector templateclass T class UnionFindSet { public: UnionFindSet(const T* a, size_t n) { for (int i 0; i n; i) { _a.push_back(a[i]);//将姓名导入vector _indexMap[a[i]] i;//map的[]的特性——给key,返回value,还有插入的功能由此可在map中做映射 } } private: vectorT _a;//数组下标就是名字的编号根据编号找人 mapT, int _indexMap;//利用map,根据人找编号 };测试用例:#includeiostream using namespace std; #includeUnionFindSet.h int main() { string a[] { 张三,李四,王五,赵六 }; UnionFindSetstring ufs(a, 4); return 0; }结果:2.不建立映射关系直接编好号的并查集的实现①.寻根(最核心)//寻根 int FindRoot(int x) { int root x; while (_ufs[root] 0) { root _ufs[root]; } return root; }root一直往上跳不断寻找父节点直到root对应的数组元素为负数便找到了根节点。②.合并//合并 void Union(int x1, int x2) { int root1 FindRoot(x1); int root2 FindRoot(x2); if (root1 root2) { return; } if (root1 root2) { swap(root1,root2);//保证小的节点去做根 } //将root2合并给root1 _ufs[root1] _ufs[root2]; _ufs[root2] root1;//root1开始当小弟它的父节点是root2 }③.是否在同一集合(同一棵树)里bool InSet(int x1, int x2) { return FindRoot(x1) FindRoot(x2); }④.统计集合个数由于数组里的元素为负数就代表这是一个根,只要统计负数的个数就能知道集合的个数。size_t SetSize() { size_t size 0; for (size_t i 0; i _ufs.size(); i) { if (_ufs[i] 0) { size; } } return size; }

相关新闻

小熊猫Dev-C++:你的第一个C++开发环境终极指南

小熊猫Dev-C++:你的第一个C++开发环境终极指南

2026/9/26 4:33:45

小熊猫Dev-C:你的第一个C开发环境终极指南 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 你是否正在寻找一款轻量级C开发环境?厌倦了复杂配置和臃肿的IDE?小熊猫Dev-C&…

AI驱动营销转型:从碎片化内容到智能品牌建设

AI驱动营销转型:从碎片化内容到智能品牌建设

2026/9/8 6:55:42

1. 营销范式革命:从"大广告"到"碎片化内容"的必然转型上世纪90年代,秦池酒业以6666万元天价夺得央视标王,次年销售额直接从1亿飙升至9.5亿。这种"春晚效应"印证了中心化媒体时代的黄金法则——品牌只需集中火力…

TMS320VC5509A DSP内存架构与外部接口配置实战指南

TMS320VC5509A DSP内存架构与外部接口配置实战指南

2026/8/28 19:58:58

1. 项目概述与核心价值在嵌入式DSP系统开发中,内存架构和外部接口的配置,往往是决定项目成败的关键,却又最容易被新手开发者忽视。我见过太多项目,算法写得漂亮,但一跑起来就卡顿、丢数据,最后追根溯源&…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…