雙連通分量
無向圖的雙連通分量跟有向圖的連通分量有點像。
先說說一些定義。
時間戳:以某個點
連通圖:每兩個點間都有路徑存在的無向圖就叫連通圖。
割頂(cut vertex):也叫割點。在某個連通圖
橋(bridge):類似的,在某個連通圖
點-雙連通:
若一個無向圖的點兩兩間都有兩條不相交(經過的點不一樣)的路徑,那麼我們就稱這個無向圖是點-雙連通的。條件等價於任意兩條邊都在一個簡單環內。
不難發現,若一個無向圖是點-雙連通圖,那麼就代表這個圖內部無割頂(既然有兩條不相交的路徑,去掉任何一個點都還是可以連通的)。
邊-雙連通:
類似的,若一個無向圖的點兩兩間都有兩條不重合(這個要求低一點,點可以重複,但邊不行)的路徑,那麼我們就稱這個無向圖是邊-雙連通的。
在邊-雙連通圖中,去掉任何一條邊,這個圖都還是連通的。
下面進入正題:
對於一張無向圖,它的點-雙連通的極大子圖稱爲雙連通分量(Biconnected Component,BCC)。
而邊-雙連通的極大子圖稱爲邊-雙連通分量(edge-biconnected component)。
如上圖:雖然{3,4,5}也是點-雙連通的,但{3,4,5,6,7}才叫雙連通分量,這就是極大子圖的意義。另外一個雙連通分量是{1,2,3}。還有,整個圖{1,2,3,4,5,6,7,8}是邊-雙連通分量。
還如上圖:對於整個圖來說,3是割頂。不難發現作爲割頂的點會同時存在於多個雙連通分量裏。而其他點只可能存在於一個雙連通分量裏。
找連通分量首先要會找割頂。
隨便找一個點作爲根,強行把無向圖轉換爲一棵樹。連回祖先的邊我們叫它反向邊(要與有向圖的反向邊區分開)。
不難發現:若某個點
用時間戳就可以知道祖孫關係。
若發現某個點的後代最多隻能連回它自己,則說明這個點及它的後代就是一個雙連通分量。
注意:用反向邊更新時,不能用連回父親的邊,這條邊沒意義。
例題:UVaLive3523(這裏題解)