当前位置: 首页 > news >正文

并查集(DSU)

基础封装

通常意义上我们默认增加“路径压缩”优化,时间复杂度为:查询 O(1)\mathcal O (1) ,合并接近于 O(α(n))\mathcal O(\alpha(n)) (这里 α\alpha 代表的是反阿克曼函数,一般看作是一个极小的常数)。

struct DSU {vector<int> fa, p;DSU(int n) {fa.resize(n + 1);iota(fa.begin(), fa.end(), 0);p.resize(n + 1, 1);}int get(int x) {while (x != fa[x]) {x = fa[x] = fa[fa[x]];}return x;}bool merge(int x, int y) { // 设x是y的祖先x = get(x), y = get(y);if (x == y) return false;if (x < y) swap(x, y); // 将编号小的合并到大的上fa[y] = x;p[x] += p[y];return true;}bool same(int x, int y) {return get(x) == get(y);}int size(int x) { // 输出连通块中点的数量return p[get(x)];}
};

求解连通块内部点、边、环信息

并查集算法除了常规意义上的寻找(时间序意义上的)祖先节点、寻找块内最小/最大的节点之外,还可以用极小的时间代价维护连通块内点的数量、边的数量、是否存在自环等等内容。除了“路径压缩”优化外,还有“启发式合并”优化能够进一步缩短合并花费的时间,然而这会影响上述罗列的最大/最小节点查找,故一般我个人习惯不添加这一优化。

struct DSU {vector<int> fa, p, e, f;DSU(int n) {fa.resize(n + 1);iota(fa.begin(), fa.end(), 0);p.resize(n + 1, 1);e.resize(n + 1);f.resize(n + 1);}int get(int x) {while (x != fa[x]) {x = fa[x] = fa[fa[x]];}return x;}bool merge(int x, int y) { // 设x是y的祖先if (x == y) f[get(x)] = 1;x = get(x), y = get(y);e[x]++;if (x == y) return false;if (x < y) swap(x, y); // 将编号小的合并到大的上fa[y] = x;f[x] |= f[y], p[x] += p[y], e[x] += e[y];return true;}bool same(int x, int y) {return get(x) == get(y);}bool F(int x) { // 判断连通块内是否存在自环return f[get(x)];}int size(int x) { // 输出连通块中点的数量return p[get(x)];}int E(int x) { // 输出连通块中边的数量return e[get(x)];}
};

模板题

https://www.luogu.com.cn/problem/P3367

http://www.rkmt.cn/news/28760.html

相关文章:

  • 第十七天
  • 如何炫酷地使用集合划分容斥
  • 蛋白表达原理与关键要素解析
  • 顾雅南的声音美化课堂
  • 玩转单片机之智能车小露——LED闪烁实战
  • 2025.10.23总结 - A
  • 大模型 | VLA 初识及在自动驾驶场景中的应用
  • DM8 安装包 for linux_x86
  • 模拟can通信
  • 202501软件工程第二次团队作业
  • 题解:P14174 【MX-X23-T4】卡常数
  • 解题报告-拯救计划(概率 DP)
  • 编程与数学 03-009 Linux 操作系统应用 22_Linux 故障排除与问题克服
  •  pytorch 66页实验题
  • 完整教程:微信小程序学习(一)
  • nginx反向代理测试搭建
  • 深入解析:【算法】【数学】 练习题目列表
  • 深入解析:链表的核心思想
  • AI元人文构想:参与“自由与责任”哲学思考——岐金兰之实验
  • 实用指南:用户研究:用户研究和数据分析的根本联系与区别
  • 完整教程:状态管理库 Zustand 的接入流程与注意点
  • 塔吊施工环境与附属设施监测!思通数科 AI 卫士筑牢全场景安全防线
  • 第二十二篇
  • CSharp: Convert CSV to XLS Using Open XML SDK
  • 负载均衡及三种软件负载
  • Android Handler的runWithScissors手段
  • 完整教程:ImmuCellAI 免疫浸润分析
  • Deepoc具身智能模型:为传统机器人注入“灵魂”,重塑建筑施工现场安全新范式 - 指南
  • P5285 [十二省联考 2019] 骗分过样例
  • Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试及其解决方法