如果乙個連通的無向圖的任意頂點刪除後,剩下的圖仍然連通,該圖被稱為雙連通的。
如果乙個圖不是雙連通的,那麼那些將其刪除後不再連通的節點,被稱為割裂點。
我們可以用深度優先生成樹來尋找割裂點,起點為樹根,每向前搜尋到乙個點就會產生一條前向邊,但有時會遇到迴路,即搜尋到經過的點,這時產生的邊稱為背向邊,背向邊並不屬於生成樹,但會在後面用到。
假設每個頂點有兩個編號:乙個是遍歷時的序號,另乙個比較令人費解,被稱為最低編號,某點的最低編號大概可以定義為:從該點通過0條或多條前向邊或背向邊所能達到的序號最低的點的序號。
繞了一圈,終於可以回到尋找割裂點的問題,什麼是割裂點呢?
1)當樹根有兩個以上的兒子時,它就是割裂點
2)對於其它點,它是割裂點當且僅當它有某個兒子的最低編號大於等於它自己的序號
為什麼會是這樣? 原書給出了「當」的證明,「僅當」則留作了課後作業,我沒做,假定是對的吧!
最後的實現反而倒簡單,原書給出了部分偽**,大致思路如下:
1)將圖
裝入乙個鄰接表, 從起點開始遍歷
2)設定當前點的序號,暫時令最低編號等於序號
3)向前搜尋第乙個鄰接點,如果產生前向邊,則從該鄰接點遞迴向前搜尋,直到無路可走後依次返回,歸途中一邊檢測當前點是否割裂點,一邊調整當前點的最低編號。如果產生背向邊,則只調整當前點的最低編號
4)反覆執行第三步,直到所有鄰接點搜尋完成
下面是對原書中示例的求解,執行結果如下:
POJ 2942 點雙連通
自己試著敲試試 莫名奇妙的過了,我還是要好好研究原理。點雙聯通 每個點與其他點都至少有兩條路徑。include include include include include include include define maxn 1020 define maxm 1000010 using nam...
HDU 5409 雙連通縮點
hdu 5409 題意 給乙個圖一些邊,保證圖連通 問對於每條邊,如果去除該邊後使得圖中一些點不連通。設這些點 u,v 要求使 u盡量小,v盡量大,輸出這樣的 u,v 否則輸出 0 0。思路 感謝 基本的思路就是找橋,然後橋兩端找找對應的最大u 和最小v。自己寫的時候寫完找橋就不會了,而且找橋找的特...
poj3177 雙連通分量
無向圖,存成有向圖,一條邊存成兩條 強連通的時候就會導致重邊形成環,用fa記錄來自的邊,注意並且用flag判斷是否只有一條那樣的反向邊 求需要添多少條邊成雙連通,記度為1的強連通分量數為ans,結果為 ans 1 2 include include include includeusing name...