文章目录
1. 动态连接问题
实际问题
Union Find 常用来解决动态连接 (Dynamic connectivity) 问题。在很多实际应用中,都存在动态连接问题,比如:
- 一张图里面的像素点的相关操作
- 网络中的计算机
- 社交网络中的好友关系
- 数学集合中的元素
- …
抽象问题
简单来说,动态连接问题可以抽象为如下问题:
有若 N 个节点 0,1,…,n-1,希望对它能有如下操作:
- Union:将两个节点连接在一起
- Find / connected query:询问两个节点是否连通
比如经过如下操作后:
union(4, 3)
union(3, 8)
union(6, 5)
union(9, 4)
union(2, 1)
可以得到连通图:
此时,
connected(0, 7) //false
connected(8, 9) //true
如果再做如下连通操作:
union(5, 0)
union(7, 2)
union(6, 1)
union(1, 0)
此时更新后的连通图如下:
此时,
connected(0, 7) //true
直观的来说,动态连接问题应该有如下等价关系:
- 自等性:
connected(p, p) //true
- 对称性
if(connected(p, q))
then connected(q, p) == true
- 传递性
if(connected(p, q) && connected(q, r))
then