模板
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
例题
力扣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