zoukankan      html  css  js  c++  java
  • 并查集

    并查集:也被称为不相交集数据结构。顾名思义,并查集主要操作是合并与查询,它是把初始不相交的集合经过多次合并操作后合并为一个大集合,然后可以通过查询判断两个元素是否已经在同一个集合中了。

    class UnionFind(object):
        """并查集类"""
        def __init__(self, n):
            """长度为n的并查集"""
            self.uf = [-1 for i in range(n + 1)]
            self.sets_count = n                     # 判断并查集里共有几个集合, 初始化默认互相独立
    
        def find(self, p):
            """尾递归"""
            # 当前值索引位置,-1没有数据,不在当前集合,直接作为根节点返回
            if self.uf[p] < 0:
                return p
            # 当前索引有数据,递归查找该数据
            self.uf[p] = self.find(self.uf[p])
            return self.uf[p]
    
        def union(self, p, q):
            """连通p,q 让q指向p"""
            proot = self.find(p)
            qroot = self.find(q)
            if proot == qroot:
                return
            elif self.uf[proot] > self.uf[qroot]:   # 负数比较, 左边规模更小
                self.uf[qroot] += self.uf[proot]
                self.uf[proot] = qroot
            else:
                self.uf[proot] += self.uf[qroot]  # 规模相加
                self.uf[qroot] = proot            # 数值指向p
            self.sets_count -= 1                    # 连通后集合总数减一
    
        def is_connected(self, p, q):
            """判断pq是否已经连通"""
            return self.find(p) == self.find(q)     # 即判断两个结点是否是属于同一个祖先

    参考:https://www.cnblogs.com/yscl/p/10185293.html

    时刻记着自己要成为什么样的人!
  • 相关阅读:
    ASP.NET 错误
    linux下使用蓝牙设备【转】
    AIDL Android中的远程接口 [转]
    Handler理解
    Hid Report Descriptor
    Android kernel x86 编译方法
    Android Init Language
    DBUS 资源
    Analysing Bluetooth Keyboard Traffic with hcidump
    DBUS基础知识
  • 原文地址:https://www.cnblogs.com/demo-deng/p/14815036.html
Copyright © 2011-2022 走看看