《DSAA》 9.6.2 雙連通性

如果一個連通的無向圖的任意頂點刪除後,剩下的圖仍然連通,該圖被稱爲雙連通的。

如果一個圖不是雙連通的,那麼那些將其刪除後不再連通的節點,被稱爲割裂點。

我們可以用深度優先生成樹來尋找割裂點,起點爲樹根,每向前搜索到一個點就會產生一條前向邊,但有時會遇到迴路,即搜索到經過的點,這時產生的邊稱爲背向邊,背向邊並不屬於生成樹,但會在後面用到。

假設每個頂點有兩個編號:一個是遍歷時的序號,另一個比較令人費解,被稱爲最低編號,某點的最低編號大概可以定義爲:從該點通過0條或多條前向邊或背向邊所能達到的序號最低的點的序號。

繞了一圈,終於可以回到尋找割裂點的問題,什麼是割裂點呢?

1)當樹根有兩個以上的兒子時,它就是割裂點

2)對於其它點,它是割裂點當且僅當它有某個兒子的最低編號大於等於它自己的序號

爲什麼會是這樣? 原書給出了“當”的證明,“僅當”則留作了課後作業,我沒做,假定是對的吧!

最後的實現反而倒簡單,原書給出了部分僞代碼,大致思路如下:

1)將圖裝入一個鄰接表, 從起點開始遍歷

2)設置當前點的序號,暫時令最低編號等於序號

3)向前搜索第一個鄰接點,如果產生前向邊,則從該鄰接點遞歸向前搜索,直到無路可走後依次返回,歸途中一邊檢測當前點是否割裂點,一邊調整當前點的最低編號。如果產生背向邊,則只調整當前點的最低編號

4)反覆執行第三步,直到所有鄰接點搜索完成

下面是對原書中示例的求解,運行結果如下:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章