在乙個無向連通圖中,如果任意去掉乙個定點i及依附於i的所有邊後得到的圖仍然連通,
則稱該圖為「2-連通圖」。否則,若得到多個連通分量,則該圖不是雙連通的,頂點i被稱為
「割點 」。
簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通
性不會任何乙個頂點的影響。這個性質具有許多重要的應用價值,例如現實中的通訊網路部署,
出於可靠性和容錯性的考慮,在結構上應考慮多連通性,盡量避免割點的存在。這樣就算乙個
通訊節點損毀,也不會對其他節點的通訊造成影響。
無向圖的極大雙連通子圖被稱為2-連通分量。乙個無向圖都具有乙個或多個2-連通分量。
如果圖本身是乙個雙連通圖,那麼它本身是自己唯一的2-連通分量。乙個無向圖具有2個或以
上2分量時,不難看出它的任意兩個2分量最多隻可能有乙個公共頂點。因為如果有多於乙個公
共頂點,就可以證明這兩個2分量實際上可以組成乙個更大的2分量,從而引起矛盾。進一步還
可以得出同一條邊不可能處於多個二分量之中,因為一條邊有兩個頂點,如果一條邊屬於多個
二分量,則相當於兩個頂點可以同時處於多個二分量之中,這與前述矛盾。
綜上,所有二分量實際上把圖劃分為了不相交的子集,連線不同二分量的邊成為割邊。
可以利用深度優先搜尋求2-連通分量。如果生成樹的root是割點,當且僅當它有多於乙個
子女。如果生成樹的非根節點是割點,當且僅當它沒有乙個後代可以通過後向邊回到它的祖先。
根據這些條件,我們定義乙個點的時間戳為深度優先數,代表著頂點在深度優先搜尋時被訪問
的先後次序,記為d。如果d(i)
知道乙個頂點是不是割點,對頂點定義引數low,low[i]為從i或其後代出發,通過後向邊所能達
到的最小深度優先數。
low[i]=min , min }
//edge為無向圖邊表,n為頂點數, e總邊數
void
twocc(
intn,
inte)
//從u做dfs,v是u之父,num為目前深度優先數
//top --> s
void
dfs(
intu,
intv,
intnum,
intd,
intlow,
ints,
inttop)
if( d[l
->
dest] ==0
)while(1
)else
if( l
->
dest
!=v )
l=l->
next;
雙連通分量
在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...
雙連通分量
雙連通分量就是無向圖中的強連通分量,基本就是找割頂和橋。割頂就是乙個點,如果把它取掉,連通分量數量就會增加,橋就是一條邊,同理。對於乙個連通圖,如果任意兩點至少存在兩條 點不重複 的路徑,也就是任意兩條邊都在乙個簡單環中,即內部無割頂,則說這個圖是點雙連通的。對於乙個連通圖,如果任意兩點至少存在兩條...
雙連通分量
無向圖的雙連通分量跟有向圖的連通分量有點像。先說說一些定義。時間戳 以某個點vi 為起點,dfs到的其他點vj 的時間。通常用pre表示 連通圖 每兩個點間都有路徑存在的無向圖就叫連通圖。割頂 cut vertex 也叫割點。在某個連通圖 g 中,若去掉某個點 i,該圖 g 無法保持所有點連通,那這...