591. 連線圖 III
阿新 • • 發佈:2020-07-09
591.連線圖 III
中文English給一個圖中的n
個節點, 記為1
到n
. 在開始的時候圖中沒有邊.
你需要完成下面兩個方法:
connect(a, b)
, 新增一條連線節點 a, b的邊query()
, 返回圖中聯通區域個數
樣例
例1:
輸入:
ConnectingGraph3(5)
query()
connect(1, 2)
query()
connect(2, 4)
query()
connect(1, 4)
query()
輸出:[5,4,3,3]
例2:
輸入測試資料(每行一個引數)如何理解測試資料?輸入: ConnectingGraph3(6) query() query() query() query() query() 輸出: [6,6,6,6,6]
並查集 union find
class ConnectingGraph3: """ @param a: An integer @param b: An integer @return: nothing """ def __init__(self, n): # initialize your data structure here. self.count = n self.father = {} for i in range(1, n + 1): self.father[i] = i def connect(self, a, b): # write your code here root_a = self.find(a) root_b = self.find(b) if (root_a != root_b): #a的父節點指向b(均是根節點,根節點連線) self.father[root_a] = root_b self.count-= 1 """ @return: An integer """ def query(self): # write your code here return self.count #找根節點 def find(self,num): origin_num = num #如果是相等的話,則直接返回本身 if self.father[num] == num: return num #如果不相等的話,則找父節點,一直更新到根節點 while num != self.father[num]: num = self.father[num] #最後,壓縮路徑 #一直到最後一個根節點為止,原始值的所有父節點都指向根節點 while self.father[origin_num] != num: temp = self.father[origin_num] self.father[origin_num] = num origin_num = temp #最終返回根節點 return num