python leetcode 547.省份数量

题目描述

在这里插入图片描述
在这里插入图片描述

解题思路

简单的修改一下原始的并查集,来判断剩下的集合的数量

代码

class DSU:
    def __init__(self,nodecount):
        self.node_relation_list=[-1]*nodecount#初始化,每个节点的祖先都是自己,记住-1,这里node_count为节点总数
    def find_ancestors(self,node):# 首先,是找到自己所在集合的最上面那一层的祖先,若不为值不为-1,说明当前自己的祖先并不是最终祖先,循环进行上司再去找他的祖先,直到找到最终祖先
        temp=node
        while self.node_relation_list[node]!=-1:
            node=self.node_relation_list[node]
        if temp!=node:#路劲压缩,使得所有节点的祖先都是最终的祖先
            self.node_relation_list[temp]=node
        return node
    def merge_ancestors(self,node1,node2):#查询两个人的祖先是不是同一个人
        node1_ancestors=self.find_ancestors(node1)
        node2_ancestors=self.find_ancestors(node2)
        if node1_ancestors!=node2_ancestors:#如果不是,那就合并两个集合,从两人中选举一个新祖先
            self.node_relation_list[node1_ancestors]=node2_ancestors
            return True
        return False
class Solution:
    def findCircleNum(self, M: List[List[int]]) -> int:
        n=len(M)
        dsu=DSU(n)#n个节点数,初始化并查集
        res=n#最开始假设有几个节点就有几个集合
        for i in range(n):
            for j in range(i+1,n):
                if M[i][j]==1 and dsu.merge_ancestors(i,j):#两个节点是连通的,但是祖先并不是同一个人,说明可以合并,集合数减一
                    res-=1
                #否则两个节点是连通的,且祖先是同一个人,则集合数量并不需要改变
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值