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; }

相关新闻

MRI放射组学与免疫微环境在子宫内膜癌保育治疗中的应用

MRI放射组学与免疫微环境在子宫内膜癌保育治疗中的应用

1. 项目背景与临床意义子宫内膜癌作为妇科常见恶性肿瘤,传统治疗方案以全子宫切除为主。但对于有生育需求的年轻患者,保育治疗(fertility-sparing treatment)成为重要选择方向。北京大学人民医院王建六教授团队发表在MedComm&…

2026/10/14 18:23:01 阅读更多 →
内存补丁与DLL劫持实战:逆向工程中的程序行为修改技术

内存补丁与DLL劫持实战:逆向工程中的程序行为修改技术

1. 项目概述:一场关于程序“心脏”与“血管”的攻防博弈逆向工程实战,听起来像是电影里黑客的专属领域,但本质上,它是一场深入软件内部、理解其运行逻辑的深度探索。今天我们要聊的“从内存补丁到DLL劫持”,正是这场探…

2026/10/5 16:46:59 阅读更多 →
百度文心一言AI对话工具核心技术解析与应用实践

百度文心一言AI对话工具核心技术解析与应用实践

1. 文心一言:百度AI对话工具的核心能力解析文心一言作为百度推出的AI对话工具,在中文场景下展现出强大的多轮对话、文本生成和知识问答能力。这款工具基于百度多年积累的自然语言处理技术,专门针对中文语境优化,能够理解复杂的语义…

2026/10/9 1:01:04 阅读更多 →

最新新闻

Kiln AI Server Python 客户端库使用指南:同步/异步 API 调用与高级定制实战

Kiln AI Server Python 客户端库使用指南:同步/异步 API 调用与高级定制实战

人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用 【免费下载链接】Kiln Build, Evaluate, and Optimize AI Systems. Includes evals, RAG, agents, fine-tuning, synthetic data generation, dataset management, MCP, and more. 项目地址: https://gitcod…

2026/10/14 18:22:46 阅读更多 →
鸿蒙应用内添加服务卡片到桌面:权限配置至formId管理的完整实践

鸿蒙应用内添加服务卡片到桌面:权限配置至formId管理的完整实践

前两天有个开发者在我写的卡片文章下面留言:应用里能不能直接触发“添加卡片到桌面”?用户根本不知道要长按桌面再选卡片,好多功能做出来都没人发现。这个问题其实问的人挺多的。鸿蒙的服务卡片虽然好用,但系统默认的添加路径藏在…

2026/10/14 18:22:46 阅读更多 →
自制轻量级单片机UI框架:低资源平台的架构设计与内存优化

自制轻量级单片机UI框架:低资源平台的架构设计与内存优化

我最早动起"自制轻量级单片机UI框架"这个念头,是在一个被现成UI库逼疯的下午。手里这块板子的MCU只给了64KB Flash和16KB RAM,产品需求却要一个带按钮、进度条和多级菜单的界面。我试着把一个开源UI库编进去,编译完一看&#xff0c…

2026/10/14 18:22:46 阅读更多 →
51单片机红外遥控NEC解码与波形显示方案

51单片机红外遥控NEC解码与波形显示方案

简介:这是一套基于51单片机的红外遥控解码与波形显示项目资料,面向电子爱好者、嵌入式初学者以及单片机课程设计/毕业设计人群,解决从红外信号接收、脉冲解码到LCD波形显示的全流程实现问题。压缩包共38个文件、9.68MB,涵盖C语言源…

2026/10/14 18:22:46 阅读更多 →
uIP TCP/IP协议栈实战:从Client到Server的嵌入式移植全解析

uIP TCP/IP协议栈实战:从Client到Server的嵌入式移植全解析

简介:基于uIP协议栈的TCP客户端与服务器程序,源自ALIENTEK战舰STM32开发板第52章,面向使用STM32与ENC28J60进行嵌入式网络通信的开发者。资源包含完整工程与配套文档,共223个文件,以C语言源文件(76个.c&…

2026/10/14 18:22:46 阅读更多 →
JavaScript sort排序原理与常见陷阱解析

JavaScript sort排序原理与常见陷阱解析

先说个我自己的真实经历。有次帮同事排查一个列表排序问题,数据是几组数字,他写了 arr.sort() ,结果排出来是 [1, 10, 2, 22, 3] 这种完全看不懂的顺序。他盯着屏幕看了半天,第一反应是"sort排序坏了"。其实不是坏了…

2026/10/14 18:21:46 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →