標籤:iss node == code 直接 stack sel fat AC
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] = node11 self.sizeDict[node] = 112 13 # def findHead(self, node):14 # father = self.fatherDict.get(node)15 # if node!=father:16 # father = self.findHead(father)17 # self.fatherDict[node] = father18 # return father19 20 def findHead(self, node): # 找到當前節點的頭21 stack = [] # 每次查詢都會最佳化,經過的節點會直接指向頭結點22 father = self.fatherDict[node]23 while node != father:24 stack.append(node)25 node = father26 father = self.fatherDict[node]27 while len(stack) > 0:28 self.fatherDict[stack.pop()] = father29 return father30 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 return37 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] = bHead44 self.sizeDict[bHead] = aSize + bSize45 else:46 self.fatherDict[bHead] = aHead47 self.sizeDict[aHead] = aSize + bSize
並查集 Python實現