※ LeetCode, UVa 與 YZUCSE 系列相關文章已從首頁的文章列表中移除。可從首頁的釘選分類瀏覽。
UVa - 10972 解題紀錄
題目: UVa - 10972 - RevolC FaeLoN
題目說明
給一個無向圖,現在要把圖轉換成有向圖,且邊可以任意定向 ( 即原本邊 (u, v),可以變為 u -> v 或 v -> u )。求需要加幾條邊才能使得轉換後的圖形為強連通 ( 即在有向圖上任意選兩點 u、v,u 能夠走到 v 且 v 也能夠走到 u )。
Input: 每組測資的第一行為兩個整數 n、m,分別代表 點的數量、邊的數量,後面 m 行每行有兩個整數 u、v,表示圖上有邊 (u, v)。
Output: 輸出最少需要加幾條邊使得圖轉換成有向圖後會是強連通。
解題思路
我們可以發現,無向圖中的 Bridge Connected Component ( 以下簡稱 BCC,注意不是 Biconnected component ),在把邊任意定向後一定可以變成一個強連通分量,原因在於強連通分量其實類似於無向圖中的環,詳細說明可參考本篇文章:【RevolC FaeLoN Uva 10972】 - 大米饼 - 博客园。
所以可以得出圖上 BCC 內的點其實不影響我們求解的結論,因此我們把圖上的所有 BCC 各自視為一個點 ( 即縮點的概念 ),而原本的 Bridge 會將這些點連接起來,接下來我們要做的就是使這些點強連通,對於縮點後的所有葉子節點,我們需要 (N + 1) / 2 條邊才能連接起來,N 為葉子節點的數量,對於縮點後的孤立點 ( 因為題目的圖不保證連通,所以可能會產生沒有連接到其他 BCC 也沒有被其他 BCC 連入的 BCC ),則需要 M 條邊才能連接起來,M 為孤立點的數量。至於原因請參考本篇文章:【RevolC FaeLoN Uva 10972】 - 大米饼 - 博客园。
解法分為以下幾個步驟:
讀取測資並建圖,記得建雙向,因為是無向圖。
DFS 找出 BCC 的數量,因為若整張圖本身就是一個 BCC 則不需要增加任何邊。
根據 DFS 算出的 low 值取得 BCC 的連接情況。
最後根據上面的方法算出需要增加的邊即可。
註: 根據 low 值判斷 BCC 的情況可能不是很正確,因為一個 BCC 內的所有節點的 low 值不一定全部一樣,但是在這個題目中不影響,因為一個被視為葉子節點的 BCC,若被視為兩個 BCC,則原本的 BCC 一定被誤認為的 BCC 所連接,因此葉子節點的數量不改變。
其實可以使用一個數組保存 BCC 的情況再求解應該會更好,不過現在有點懶,之後再寫吧。
參考解法
1 |
|
參考資料
【RevolC FaeLoN Uva 10972】 - 大米饼 - 博客园
uva 10972 RevolC FaeLoN - Titanium - 博客园