首页 > 编程语言 >Python算法模版——并查集

Python算法模版——并查集

时间:2024-11-21 20:15:03浏览次数:3  
标签:Python 模版 self 查集 father find root 节点 size

        并查集常用于与图或树相关的算法题中,一个最为经典应用场景是求无向图的连通分量,为方便大家使用并查集算法,这里为大家提供一个Python的并查集算法模版,并加有详细注释。

class UnionFind:
    def __init__(self, n):
        # n代表总共有n个节点,初始时每个节点以自己为父节点
        # 使用father数组存储各个节点的父节点
        self.father= [x for x in range(n)]
        # 使用size数组,存储每个集合中的数量,初始时每个节点自己为一个集合,故初始值为1
        # 注意只有使用各个集合的根节点的查询出的size值才有意义
        self.size = [1 for _ in range(n)]
        # part表示此时并查集中的集合数量,初始没有任何节点相连,故初始值为n,表示有n个不同的集合
        self.part = n

    def find(self, x):
        # find方法使用递归的方式查询某节点的父节点,并进行路径压缩,
        # 使father数值中直接存储每个节点所连的根节点
        if self.father[x] != x:
            self.father[x] = self.find(self.father[x])
        return self.father[x]

    def union(self, x, y):
        # union方法用于合并两个节点
        # 首先使用find方式找到x,y节点对应的根节点
        root_x = self.find(x)
        root_y = self.find(y)
        # 如果两个根节点相同,表示x,y以及处于一个集合中,返回False表示合并失败
        if root_x == root_y:
            return False
        # 按size合并两个集合,使root_x始终为size值较小的一方
        if self.size[root_x] > self.size[root_y]:
            root_x, root_y = root_y, root_x
        # 合并root_x,root_y,将root_x的父节点置为root_y
        self.father[root_x] = root_y
        # 在root_y所对应的集合中加入root_x所对应的集合中的元素数量
        self.size[root_y] += self.size[root_x]
        # 将集合的总数减一
        self.part -= 1
        return True
    
    def connected(self, x, y):
        # 该方法用于判断x,y两个节点是否属于同一个集合
        return self.find(x) == self.find(y)

    def get_size(self, x):
        # 该方法用于获得x所在集合中的元素数量
        return self.size[self.father[x]]

 

标签:Python,模版,self,查集,father,find,root,节点,size
From: https://blog.csdn.net/2401_86480334/article/details/143925545

相关文章

  • 接口测试之python+rquest+unittest分层自动化框架
    一、新建一个项目接口自动化框架设计实战:第一包:config第二包:api组建接口包第三个包:testcase存放用例,第四个包:report包报告包第五包:utils包工具类包第六个包:run二、邮箱设置断言:接口断言参考:讲解稿:首先在pycharm里新建一个项目,然后构建6个包,分别是api构......
  • 【C++学习笔记】一个先学了Java,Python,Csharp最后再来学C++的菜狗笔记
    1.字符串1.char数组charstr[]="helloworld";可以使用cstring库中的函数(如strlen,strcpy)。2.string类型#include<string>stringstr="helloworld";与csharp,java等语言不同的是动态分配内存,由标准库管理。支持操作符重载(如+,==等)。std::string是可变的,类似......
  • python-day07-面向对象进阶
    isinstance和issubclassisinstance(obj,cls)检查是否obj是否是类cls的对象123456class Foo(object):     pass   obj = Foo()   isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类 1234......
  • 当我处于无限流---Python实现简易猜数字
    目标:设计一个猜数字游戏,使用户在(1-50)范围内猜到(1-11)范围为成功,确保游戏能重复进行(家人们,重生之系列有点难编,最近江郎才尽了QAQ)说明:(1,11)事实上为左闭右开猜1-->对    猜11-->错   猜0-->错 #无限流,循环一下whileTrue:#指引玩家开始猜数字player=int(in......
  • 【Python】0基础学Python——字符串编码、base64编码、不可逆加密、公私钥存储、公钥
    0基础学Python——字符串编码、base64编码、不可逆加密、公私钥存储、公钥加密私钥解密、签名和认证、函数标注类型字符串编码base64编码地址解码-1地址解码-2不可逆加密md5加密sha256加密公私钥存储获取密钥对获取字符串流存储到文件公钥加密私钥解密公钥加密1.字符......
  • 【Python】0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、p
    0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、pickle序列化、序列化升级函数参数传递参数传递类型标注函数细分task任务型函数consumer消费型函数functional功能型函数类的信息元类type作用自定义元类pickle序列化序列化反序列化序列化升......
  • 重生之我在Python中计算圆的周长和面积(第三章)
     ‘系统,你便用这些来搪塞朕吗,你寄身于孤,也要拿出些诚意来!’听到我的话,系统不禁打了个寒颤‘这世上竟有和我讨价还价的宿主,也罢,如今也是有求于他,便再展示一般吧!’系统内心不禁感慨随后荧光乍现,又一串神秘数字出现在眼前(不二家.jdp)             ......
  • python-5-常用模块
    python-5-常用模块什么是模块?  常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。  但其实import加载的模块分为四个通用类别:1使用python编写的代码(.py文件)2已被编译为共享库或DLL的C或C++扩展3包好一组模......
  • Python 入门(小白版)の7个基础代码 @Kerin森森
    Python,据说是很好入门的一门编程语言,so它也变成了0基础的我(@Kerin森森)的入门选择,在这里分享一下自己的一些学习记录and心得吧。如果你也和我一样是初学者,那就跟森森一起学习一起进步吧!1.第一个Python程序:HelloWorld每个程序员的旅程几乎都是从打印“Hello,World!”开始的......
  • 【python系列】python数据类型之列表
    一、什么是列表在Python中,列表(List)是一种用于存储有序数据的容器。它的特性包括:有序性:列表中的元素有固定的顺序。可变性:可以修改列表中的元素。支持任意数据类型:列表中的元素可以是数字、字符串、布尔值,甚至是其他列表。通过索引访问:列表使用从0开始的索引定位元素......