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

    时刻记着自己要成为什么样的人!
  • 相关阅读:
    scrapy通过修改配置文件发送状态邮件
    python高级编程读书笔记(一)
    linux,mac安装sentry
    mac安装sentry
    pop3设置
    流程图
    车险或将二次费改 又可以省钱了?
    ATM:模拟实现一个ATM + 购物商城程序
    作业1开发一个简单的python计算器
    re正则表达式
  • 原文地址:https://www.cnblogs.com/demo-deng/p/14815036.html
Copyright © 2011-2022 走看看