新闻中心
C++怎么实现一个并查集算法_C++算法设计与并查集实现
并查集通过路径压缩和按秩合并高效处理集合合并与查询,支持连通性判断、求连通分量等操作,常用于Kruskal算法、岛屿问题等场景。

并查集(Union-Find)是一种高效处理不相交集合合并与查询的数据结构,常用于解决连通性问题,比如判断图中两个节点是否连通、求连通分量个数等。在 C++ 中实现并查集非常直观,核心操作包括查找(find)和合并(union)。通过路径压缩和按秩合并优化,可以将时间复杂度接近常数级别。
基本结构与初始化
并查集通常用一个数组 parent 来表示每个元素的父节点,初始时每个元素的父节点是自己,表示各自独立成一个集合。
还可以引入 rank 数组来记录每棵树的“秩”(近似高度),用于优化合并操作。
class UnionFind {
public:
vector<int> parent;
vector<int> rank;
// 构造函数,初始化 n 个独立元素
UnionFind(int n) {
parent.resize(n);
rank.resize(n, 0);
for (int i = 0; i < n; ++i) {
parent[i] = i; // 每个节点初始指向自己
}
}
// 查找根节点,带路径压缩
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]); // 路径压缩:直接连接到根
}
return parent[x];
}
// 合并两个集合,按秩合并优化
void unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) return; // 已在同一集合
// 按秩合并:把低秩树接到高秩树下
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
// 判断两个元素是否属于同一集合
bool connected(int x, int y) {
return find(x) == find(y);
}
};
关键优化:路径压缩与按秩合并
这两个优化策略显著提升并查集效率:
- 路径压缩:在 find 过程中,把沿途所有节点直接连到根节点,降低后续查找成本。
- 按秩合并:合并时尽量让较矮的树接在较高的树下,避免生成过深的树,控制整体高度。
经过这两种优化后,单次操作的平均时间复杂度接近 O(α(n)),其中 α 是阿克曼函数的反函数,增长极慢,可视为常数。
Whimsical
Whimsical推出的AI思维导图工具
182
查看详情
实际应用场景举例
假设要判断无向图中边的连接是否会形成环,可以用并查集逐条处理边:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 5;
UnionFind uf(n);
// 添加边 (0,1), (1,2), (3,4)
uf.unite(0, 1);
uf.unite(1, 2);
uf.unite(3, 4);
cout << "0 和 2 连通吗?" << (uf.connected(0, 2) ? "是" : "否") << endl; // 是
cout << "0 和 3 连通吗?" << (uf.connected(0, 3) ? "是" : "否") << endl; // 否
uf.unite(2, 3);
cout << "0 和 4 连通了吗?" << (uf.connected(0, 4) ? "是" : "否") << endl; // 是
return 0;
}
总结与扩展建议
并查集适合动态维护集合的合并与查询,代码简洁且效率高。在算法竞赛或工程中常用于:
- Kruskal 最小生成树算法
- 岛屿数量问题(替代 DFS/BFS)
- 社交网络中的好友关系连通判断
可以根据需要扩展支持集合大小统计、删除操作(需更复杂结构)等功能。掌握基础实现后,灵活应用是关键。
基本上就这些。以上就是C++怎么实现一个并查集算法_C++算法设计与并查集实现的详细内容,更多请关注其它相关文章!
# 还可以
# 舟山网站优化公司哪家好
# seo优化简历怎么写
# 站长之家seo流量
# 设计公司论坛推广营销
# 营销推广什么意思啊
# SEO改进方案
# 兴义网站优化推广
# 李沧区网站运营推广
# 上海矩阵seo方法
# 黄山网站建设加盟
# 较高
# 可以用
# ai
# 是一种
# 边缘
# 图中
# 树下
# 并与
# 游戏开发
# 数据结构
# 社交网络
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
苹果手机如何防止被恶意App追踪
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
如何将HTML表格多行数据保存到Google Sheet
Angular Material 垂直步进器:实现底部到顶部排序的教程
J*aScript动态修改指定div内所有a标签样式指南
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
4399免费游戏网址入口 4399小游戏免费入口点开即玩
抖音网页版快捷访问 抖音网页版网页版入口操作教程
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
SteamMachine定价或为699美元 大家想入手吗?
押井守高度称赞《辐射4》:玩了八年都停不下来!
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
Typer应用中灵活处理命令行参数的令牌化与解析
小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍
J*aScript教程:根据元素文本内容动态设置背景色
J*aScript打印功能_j*ascript输出控制
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
mc.js官网登录入口 mc.js官方登录入口最新版
age动漫网站入口 age动漫官网直接访问入口
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
Angular中单选按钮的正确使用与常见陷阱解析
Win11网速慢怎么解决 Win11网络设置优化解除限速
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
Go语言中JSON数据解析与字段访问教程
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理
qq游戏大厅官方下载_qq游戏免费下载安装入口
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
163邮箱官方主页登录 直达网易邮箱登录核心页面
ACG动漫视频网入口 ACG动漫*免费正版观看地址
J*aScript Promise链中如何正确终止后续.then执行并处理错误
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
必由学登录入口 必由学官方网站在线访问链接
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
深入理解J*a链表中的IPosition接口与使用
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
高德地图公交到站提醒失败如何解决 高德提醒权限设置
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
照顾宝贝2小游戏免费秒玩入口
解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
mcjs网页版在线存档 mcjs云存档登录入口
iCloud登录入口网页版 苹果iCloud官网登录
顺丰快件物流信息 官方网站查询入口
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
支付宝如何设置安全保护_支付宝安全设置的全面教程


2025-11-18
浏览次数:次
返回列表