python并查集模板

模板

class UnionFind():
    def __init__(self,n):
        self.parent=list(range(n))
        self.count=n   #记录组数
    def find(self,node):  #查找node的父节点
        while node!=self.parent[node]:
            self.parent[node]=self.parent[self.parent[node]] #路径压缩
            node=self.parent[node]
        return node
    def union(self,node1,node2):  #将两个node合并为一组
        node1father=self.find(node1)
        node2father=self.find(node2)
        if node1father!=node2father:
            self.parent[node1father]=node2father
            self.count-=1
        return

例题

力扣547 省份数量

class UnionFind():
    def __init__(self,n):
        self.parent=list(range(n))
        self.count=n
    def find(self,node):
        while node!=self.parent[node]:
            self.parent[node]=self.parent[self.parent[node]]
            node=self.parent[node]
        return node
    def union(self,node1,node2):
        node1father=self.find(node1)
        node2father=self.find(node2)
        if node1father!=node2father:
            self.parent[node1father]=node2father
            self.count-=1
        return

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        n=len(isConnected)
        uf=UnionFind(n)
        for i in range(n):
            for j in range(n):
                if isConnected[i][j]==1:
                    uf.union(i,j)
        return uf.count


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值