題目連結:
給定兩正整數 n 、 m ( n ≦ 10,000 , m ≦ 1,000,000 ),代表有 n 座城市(編號為 1 ~ n )以及 m 座橋。
接著的 m 列輸入,第一列是編號為 1 的橋、第二列是編號 2 的橋……以此類推。每列給定兩正整數 a 、 b ,代表該橋樑連結城市 a 與城市 b 。
再接著給定一正整數 q ( q ≦ m )代表接著要炸毀 q 座橋。接下來的 q 列輸入,每列給定一正整數,代表要毀掉的橋之編號。
城市之間如果為同一區域,代表之間可以經由彼此的橋樑或是可以經由其他城市抵達。
試問:每毀掉一座橋之後,這 n 個城市被分成幾個區域。
先將所有會被炸毀的橋依序存入陣列裡。接著,把所有不會被炸的橋,用併查集(Union-Find Set)的形式建成一個圖。判斷現在這張圖有幾個區域(有幾個不同的根節點(root)),此即為所有要被炸毀的橋接毀壞之後的區塊數。
接著,復原最後炸的一座橋,同樣用並查集去加上這條邊。統計新的圖有幾個區域,我們可以得到倒數第二個應輸出的答案。重複以上步驟直到恢復到第二座被炸的橋,得到了炸毀第一座橋之後的區域數。
最後將所有得到的區域數倒著輸出(因為我們求得的順序是倒著的)即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。