并查集实现

python 实现并查集,复杂度常数级别

class UnionFind(object):
  def __init__(self, n) -> None:
    # 存储x节点的祖先节点
    self.parent = [i for i in range(n)]
    # 存储当前节点的深度
    self.rank = n * [1]

  def find(self, x):
    '''寻找x的祖先节点'''
    if x == self.parent[x]:
      return x
    # 如果x的父节点不是祖先,一直递归往上找
    self.parent[x] = self.find(self.parent[x])
    return self.parent[x]
  
  def is_same(self, x, y):
    '''判断x和y是否有相同祖先,即是否连通'''
    return self.find(x) == self.find(y)
  
  def union(self, x, y):
    '''合并两个节点,即让两个节点拥有共同的祖先'''
    parent_x = self.find(x)
    parent_y = self.find(y)
    if parent_x != parent_y:
      if self.rank[parent_x] < self.rank[parent_y]:
        # 如果x的这边深度比较少,修改x的祖先的父亲是y的祖先
        self.parent[parent_x] = parent_y
      elif self.rank[parent_x] > self.rank[parent_y]:
        self.parent[parent_y] = parent_x
      else:
        self.parent[parent_y] = parent_x
        self.rank[parent_x] += 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值