1. 程式人生 > 實用技巧 >591. 連線圖 III

591. 連線圖 III

591.連線圖 III

中文English

給一個圖中的n個節點, 記為1n. 在開始的時候圖中沒有邊.
你需要完成下面兩個方法:

  1. connect(a, b), 新增一條連線節點 a, b的邊
  2. 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