news 2026/6/11 10:24:15

C++并查集:高效解决连通性问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++并查集:高效解决连通性问题

一、前言

C++ 语法、面向对象、STL 已经全部收官。从今天开始,正式进入高阶数据结构与算法深耕。首篇先学并查集:结构简单、代码短、考点极多、适用场景非常广。

二、并查集是什么

并查集(Disjoint Set Union,DSU)三个核心操作:

  1. 合并:把两个集合合并成一个
  2. 查找:找某个元素的根节点
  3. 判连通:判断两个元素是否在同一个集合

形象理解:每个人是一个节点,认识的人归为一个圈子,并查集就是用来管理圈子、合并圈子、查是否同圈

三、并查集核心思想

  • 每个节点有一个父节点 parent []
  • 根节点:自己的父节点是自己
  • 找祖先:一路往上找,直到父节点等于自身
  • 合并集合:把一个集合的根,挂到另一个集合根下面

四、基础朴素版并查集

1. 初始化

每个人初始自己是一个集合,父节点等于自己

const int N = 1005; int parent[N]; // 初始化 void init(int n) { for(int i = 1; i <= n; i++) { parent[i] = i; } }

2. 查找根节点

int find(int x) { if(parent[x] == x) return x; return find(parent[x]); }

3. 合并两个集合

void unite(int x, int y) { int fx = find(x); int fy = find(y); if(fx != fy) { parent[fy] = fx; } }

4. 判断是否连通

bool isSame(int x, int y) { return find(x) == find(y); }

五、优化一:路径压缩(必加)

朴素版查找层数多、效率低。路径压缩:查找时把沿途所有节点直接挂到根节点,下次查找 O (1)。

优化后 find 函数:

int find(int x) { if(parent[x] == x) return x; // 路径压缩:递归回溯直接指向根 parent[x] = find(parent[x]); return parent[x]; }

刷题默认必写路径压缩

六、优化二:按秩合并(可选)

维护树的高度 / 节点数量,合并时小树挂大树,防止树过高。日常刷题只写路径压缩就够用,竞赛再加上按秩合并。

七、并查集完整万能模板(可直接复制刷题)

#include <iostream> using namespace std; const int N = 1005; int parent[N]; // 初始化 void init(int n) { for(int i = 1; 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) { x = find(x); y = find(y); if(x != y) parent[y] = x; } // 判断同集合 bool same(int x, int y) { return find(x) == find(y); } int main() { int n,m; cin >> n >> m; init(n); while(m--) { int op,x,y; cin >> op >> x >> y; if(op == 1) unite(x,y); else { if(same(x,y)) cout << "Yes\n"; else cout << "No\n"; } } return 0; }

八、经典适用场景

  1. 判断图中两点是否连通
  2. 朋友圈、亲戚关系合并
  3. 最小生成树 Kruskal 算法必备
  4. 岛屿数量、连通块统计
  5. 区间合并、分组问题

九、今日核心总结

  1. 并查集三大操作:初始化、查找、合并
  2. 路径压缩是标配优化,极大提升效率
  3. 模板固定,刷题直接套用即可
  4. 常用于连通性判断、集合合并、图论基础题

十、课后练习

  1. 手写并查集模板,实现 5 个元素合并、判断连通
  2. 输入多组关系,统计最终有多少个独立连通块
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 10:23:33

I2C总线实战指南:从扫描到传感器连接与电池监控

1. I2C总线&#xff1a;嵌入式开发的“万能胶水”在捣鼓Arduino、ESP32这类微控制器项目时&#xff0c;你肯定遇到过这样的场景&#xff1a;想接个温湿度传感器、再加个OLED屏幕显示数据&#xff0c;可能还得挂个实时时钟模块。如果每个设备都用独立的数字引脚&#xff0c;那点…

作者头像 李华
网站建设 2026/6/11 10:22:39

Adabox 001套件入门指南:从零构建物理计算项目

1. 项目概述&#xff1a;从零开始的物理计算之旅如果你对电子制作感兴趣&#xff0c;但又觉得它门槛太高&#xff0c;需要一堆看不懂的电路图和复杂的焊接工具&#xff0c;那Adabox 001套件就是为你准备的。它不是一个简单的零件包&#xff0c;而是一张通往“物理计算”世界的门…

作者头像 李华
网站建设 2026/5/15 7:25:13

CircuitPython嵌入式开发实战:内存管理与无线连接优化指南

1. 项目概述与核心价值如果你和我一样&#xff0c;从传统的Arduino C/C开发转向更友好的微控制器编程&#xff0c;那么CircuitPython绝对是一个让人眼前一亮的发现。它把Python的简洁和强大带到了像Adafruit Feather、Raspberry Pi Pico这样的嵌入式硬件上&#xff0c;让快速原…

作者头像 李华
网站建设 2026/5/15 7:24:45

3步终极指南:用TCC-G15彻底解决Dell G15散热难题

3步终极指南&#xff1a;用TCC-G15彻底解决Dell G15散热难题 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 你的Dell G15笔记本是否经常过热导致游戏卡顿&…

作者头像 李华
网站建设 2026/5/15 7:23:31

Feather M0 LoRa开发板实战:从硬件组装到低功耗物联网节点开发

1. 项目概述&#xff1a;为什么选择Feather M0 LoRa&#xff1f;如果你正在寻找一个能快速搭建、功耗又低、通信距离还远的无线传感节点方案&#xff0c;那么Adafruit Feather M0 LoRa Radio开发板大概率会进入你的视野。我最初接触它&#xff0c;是为了解决一个野外环境数据采…

作者头像 李华