题目描述
解题思路
简单的修改一下原始的并查集,来判断剩下的集合的数量
代码
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