切換
舊版
前往
大廳
主題

ZeroJudge - b570: 為什麼你們都喜歡撞來撞去的? 解題心得

Not In My Back Yard | 2019-08-04 16:48:56 | 巴幣 2 | 人氣 288

題目連結:


題目大意:
給定兩正整數 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 個城市被分成幾個區域。



範例輸入:
3 3
1 2
2 3
1 3
3
1
2
3


範例輸出:
1
2
3


解題思維:
先將所有會被炸毀的橋依序存入陣列裡。接著,把所有不會被炸的橋,用併查集(Union-Find Set)的形式建成一個圖。判斷現在這張圖有幾個區域(有幾個不同的根節點(root)),此即為所有要被炸毀的橋接毀壞之後的區塊數。

接著,復原最後炸的一座橋,同樣用並查集去加上這條邊。統計新的圖有幾個區域,我們可以得到倒數第二個應輸出的答案。重複以上步驟直到恢復到第二座被炸的橋,得到了炸毀第一座橋之後的區域數。

最後將所有得到的區域數倒著輸出(因為我們求得的順序是倒著的)即可。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作