1 # 并查集实现 2 class Node: 3 pass 4 5 class UnionFindSet: 6 def __init__(self, nodes): 7 self.fatherDict = dict() 8 self.sizeDict = dict() 9 for node in nodes: 10 self.fatherDict[node] = node 11 self.sizeDict[node] = 1 12 13 # def findHead(self, node): 14 # father = self.fatherDict.get(node) 15 # if node!=father: 16 # father = self.findHead(father) 17 # self.fatherDict[node] = father 18 # return father 19 20 def findHead(self, node): # 找到当前节点的头 21 stack = [] # 每次查询都会优化,经过的节点会直接指向头结点 22 father = self.fatherDict[node] 23 while node != father: 24 stack.append(node) 25 node = father 26 father = self.fatherDict[node] 27 while len(stack) > 0: 28 self.fatherDict[stack.pop()] = father 29 return father 30 31 def isSameSet(self, a, b): 32 return self.findHead(a) == self.findHead(b) 33 34 def uion(self, a, b): # 两集合合并 35 if a is None or b is None: 36 return 37 aHead = self.findHead(a) 38 bHead = self.findHead(b) 39 if aHead != bHead: 40 aSize = self.sizeDict[aHead] 41 bSize = self.sizeDict[bHead] 42 if aSize <= bSize: 43 self.fatherDict[aHead] = bHead 44 self.sizeDict[bHead] = aSize + bSize 45 else: 46 self.fatherDict[bHead] = aHead 47 self.sizeDict[aHead] = aSize + bSize