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

并查集题解:合并之前,先问清楚关系会不会传递

并查集题解:合并之前,先问清楚关系会不会传递

并查集适合解决“连通性”和“等价关系”问题。很多题一看到合并就想用并查集,但并不是所有关系都能合并。使用前先问:这个关系是否传递?如果 A 和 B 同组,B 和 C 同组,是否能推出 A 和 C 同组?

并查集不是万能胶水。关系能传递,才适合粘。

一、并查集的核心操作

并查集只有两个核心操作:find 找代表,union 合并集合。

flowchart TD A[元素 x] --> B[find(x)] C[元素 y] --> D[find(y)] B --> E{代表是否相同} D --> E E -->|否| F[union 合并] E -->|是| G[已经连通]

路径压缩和按秩合并让它非常快,近似 O(1)。

二、代码模板

class DSU: def __init__(self, n): self.parent = list(range(n)) self.rank = [0] * n def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, a, b): ra, rb = self.find(a), self.find(b) if ra == rb: return False if self.rank[ra] < self.rank[rb]: ra, rb = rb, ra self.parent[rb] = ra if self.rank[ra] == self.rank[rb]: self.rank[ra] += 1 return True

union返回是否真的合并,很多题用它判断是否形成环。

三、适用题型

朋友圈、省份数量、冗余连接、岛屿数量、等式方程可满足性,都很适合并查集。它们共同点是关系能传递。

不适合的场景:有方向依赖、最短路径、顺序约束。比如“谁先完成谁”,这不是并查集合并能解决的。

四、复杂度和边界

初始化 O(n),每次 find/union 近似 O(1)。边界要注意编号从 0 还是 1 开始,二维网格映射到一维时不要算错。

idx = r * cols + c

映射错了,并查集会把毫不相干的格子合在一起,结果很有喜剧效果,但提交会很悲剧。

并查集还常用于“等式和不等式”判断。先合并所有相等关系,再检查不等关系是否冲突。顺序很重要,不能边看边随便判断。

def equationsPossible(equations): dsu = DSU(26) for e in equations: if e[1:3] == "==": dsu.union(ord(e[0])-97, ord(e[3])-97) for e in equations: if e[1:3] == "!=" and dsu.find(ord(e[0])-97) == dsu.find(ord(e[3])-97): return False return True

这个例子能说明并查集的典型流程:先建立等价类,再验证约束。它不是用来求路径,而是用来维护集合关系。

五、总结

并查集适合传递关系和连通性问题。核心是 find、union、路径压缩和按秩合并。

合并之前,先问清楚关系会不会传递。能传递,放心粘;不能传递,换工具。

http://www.jsqmd.com/news/1117991/

相关文章:

  • Free Texture Packer终极指南:高效精灵图打包完整教程
  • LTC6903与PIC18F86J11构建数字控制振荡器方案
  • 实战指南:5步精通MDUT多数据库利用工具的开发与定制
  • 2024年Tomcat手动配置实战与优化指南
  • Node.js核心能力与性能优化实战指南
  • 如何撰写合规高质量的AI模型技术对比博文
  • BaiduPCS-Web:免费开源百度网盘下载加速终极指南
  • EasyGoAdmin 敏捷开发框架 v3.1.1 更新,多版本多组件助力开发效率提升!
  • 如何解决Godot游戏性能瓶颈:C++扩展开发实战指南
  • STM32F407VGT6驱动RGB LED矩阵的嵌入式系统设计
  • Windows网络性能测试利器:iperf3完整安装与使用实战指南
  • 自动驾驶感知 vs 具身智能感知:本质差异全解析
  • Godot 收紧 AI 代码贡献政策:提高门槛,减少低质量贡献,培养长期开发者
  • 终极免费方案:IDM激活脚本完全指南 - 永久冻结30天试用期
  • Promptfoo:面向生产环境的LLM提示词质量评估框架
  • AutoX.js v7.2.2 发布!修复内存泄露,最新版下载地址分享(附官方文档)
  • Text-to-CAD UI终极指南:如何用一句话生成专业3D模型
  • TQVaultAE终极指南:彻底解决《泰坦之旅周年版》背包空间不足的5个实用技巧
  • Win11Debloat终极指南:简单三步让你的Windows 11更快更清爽 [特殊字符]
  • 大学生必备7款一键生成论文工具,一站式搞定选题初稿与降重
  • 基于鸿蒙HarmonyOS NEXT开发AI电影推荐应用:智能观影新体验与鸿蒙Flutter框架跨端实践
  • AI智能体技能(Skill)开发指南与最佳实践
  • Python+JMeter压测实战:10万级仿真数据生成与参数化全流程
  • 性能测试工具选型指南:JMeter、k6、Gatling等主流工具深度对比与实战避坑
  • MMMU:多模态AI理解能力的专业评估框架技术深度解析
  • 3步快速掌握小红书无水印下载:XHS-Downloader终极解决方案
  • 深入解析AI老照片修复技术:基于GFPGAN与Next.js的架构设计与实现原理
  • 3步开启你的桌面宠物养成之旅:从零到一的DyberPet完全指南
  • 深入pytest_collection_modifyitems钩子:定制化测试用例执行与调度
  • E-Hentai漫画批量下载器:免费快速获取完整漫画的终极解决方案