并查集

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 connected(p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值