特点:用集合中的一个元素代表一个集合,就像帮主代替帮派,主要分为三步,初始化,查询,合并。
用途:用来分离无环图,找到公共祖先等等。
class AndCheckSet:
def __init__(self, n=5):#初始化
self.fa = [0]*n
for i in range(n):
self.fa[i] = i
def find(self, x):#查询
if (self.fa[x] == x):
return x
else:
return self.find(self.fa[x])
def merge(self, i, j):#合并
self.fa[self.find(i)] = self.find(j)
sol = AndCheckSet(n=5)
print('==sol.fa:', sol.fa)
index = sol.find(1)
print('==index:', index)
sol.merge(0, 1)
print('==sol.fa:', sol.fa)
index = sol.find(0)
print('==index:', index)
sol.merge(1, 2)
print('==sol.fa:', sol.fa)
index = sol.find(1)
print('==index:', index)
leetcode示例:
#并查集:合并公共节点的,对相邻节点不是公共祖先的进行合并
class Solution:
def find(self, index): # 查询
if self.parent[index] == index: # 相等就返回
return index
else:
return self.find(self.parent[index]) # 一直递归找到节点index的祖先
def union(self, i, j): # 合并
self.parent[self.find(i)] = self.find(j)
def findRedundantConnection(self, edges):
nodesCount = len(edges)
self.parent = list(range(nodesCount + 1))
print('==self.parent:', self.parent)
for node1, node2 in edges:
print('==node1, node2:', node1, node2)
if self.find(node1) != self.find(node2):#相邻的节点公共祖先不一样就进行合并
print('===hahhaha===')
self.union(node1, node2)
print('=self.parent:', self.parent)
else:
return [node1, node2]
return []
edges = [[1, 2], [1, 3], [2, 3]]
sol = Solution()
res = sol.findRedundantConnection(edges)
print('=res:', res)