無向圖的雙連通分量跟有向圖的連通分量有點像。
先說說一些定義。
時間戳:以某個點vi
為起點,dfs到的其他點vj
的時間。通常用pre表示
連通圖:每兩個點間都有路徑存在的無向圖就叫連通圖。
割頂(cut vertex):也叫割點。在某個連通圖
g 中,若去掉某個點
i,該圖
g 無法保持所有點連通,那這個點就是割頂。
橋(bridge):類似的,在某個連通圖
g中,若去掉某個邊
e ,該圖
g無法保持所有點連通,那這個邊就叫橋。
若乙個無向圖的點兩兩間都有兩條不相交(經過的點不一樣)的路徑,那麼我們就稱這個無向圖是點-雙連通的。條件等價於任意兩條邊都在乙個簡單環內。
不難發現,若乙個無向圖是點-雙連通圖,那麼就代表這個圖內部無割頂(既然有兩條不相交的路徑,去掉任何乙個點都還是可以連通的)。
邊-雙連通:
類似的,若乙個無向圖的點兩兩間都有兩條不重合(這個要求低一點,點可以重複,但邊不行)的路徑,那麼我們就稱這個無向圖是邊-雙連通的。
在邊-雙連通圖中,去掉任何一條邊,這個圖都還是連通的。
對於一張無向圖,它的點-雙連通的極大子圖稱為雙連通分量(biconnected component,bcc)。
而邊-雙連通的極大子圖稱為邊-雙連通分量(edge-biconnected component)。
如上圖:雖然也是點-雙連通的,但才叫雙連通分量,這就是極大子圖的意義。另外乙個雙連通分量是。還有,整個圖是邊-雙連通分量。
還如上圖:對於整個圖來說,3是割頂。不難發現作為割頂的點會同時存在於多個雙連通分量裡。而其他點只可能存在於乙個雙連通分量裡。
找連通分量首先要會找割頂。
隨便找乙個點作為根,強行把無向圖轉換為一棵樹。連回祖先的邊我們叫它反向邊(要與有向圖的反向邊區分開)。
不難發現:若某個點
v 的後代都沒有反向邊連回
v的祖先,那麼就可以得出
v 是割頂的結論。
用時間戳就可以知道祖孫關係。
若發現某個點的後代最多只能連回它自己,則說明這個點及它的後代就是乙個雙連通分量。
注意:用反向邊更新時,不能用連回父親的邊,這條邊沒意義。
例題:uvalive3523(這裡題解)
雙連通分量
在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...
雙連通分量
在乙個無向連通圖中,如果任意去掉乙個定點i及依附於i的所有邊後得到的圖仍然連通,則稱該圖為 2 連通圖 否則,若得到多個連通分量,則該圖不是雙連通的,頂點i被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...
雙連通分量
雙連通分量就是無向圖中的強連通分量,基本就是找割頂和橋。割頂就是乙個點,如果把它取掉,連通分量數量就會增加,橋就是一條邊,同理。對於乙個連通圖,如果任意兩點至少存在兩條 點不重複 的路徑,也就是任意兩條邊都在乙個簡單環中,即內部無割頂,則說這個圖是點雙連通的。對於乙個連通圖,如果任意兩點至少存在兩條...