割點 橋 極大連通子圖(雙連通分支)

割點:  

        假如在刪去定點V以及和v相關聯的各邊之後,將圖的一個連通分量分割成兩個或兩個以上的連通分量,則稱定點v爲該圖的一個割點(關節點)。

 

重連通圖: 一個沒有割點的圖稱爲是重連通圖。

       在重連通圖上,任意一對頂點之間至少存在兩條路徑,則在刪去某個頂點以及依附於該頂點的各邊時也不破壞圖的連通性。

       若在連通圖上至少刪去k個頂點才能破壞圖的連通性,則稱此圖的連通度爲k。

 

雙連通圖

如果一個無向連通圖的點連通度大於1,則稱該圖是點雙連通的,簡稱雙連通或重連通。

如果一個無向連通圖的邊連通度大於1,則稱該圖是邊雙連通的,簡稱雙連通或重連通。

可以看出,點雙連通與邊雙連通都可以簡稱爲雙連通,它們之間是有着某種聯繫的,下文中提到的雙連通,均既可指點雙連通,又可指邊雙連通。

 

雙連通分支:

在圖G的所有子圖G’中,如果G’是雙連通的,則稱G’爲雙連通子圖。如果一個雙連通子圖G’它不是任何一個雙連通子圖的真子集,則G’爲極大雙連通子圖雙連通分支(biconnected component),或重連通分支,就是圖的極大雙連通子圖。特殊的,點雙連通分支又叫做

 

[求割點與橋]

該算法是R.Tarjan發明的。對圖深度優先搜索,定義DFS(u)爲u在搜索樹(以下簡稱爲樹)中被遍歷到的次序號。定義Low(u)爲u或u的子樹中能通過非父子邊追溯到的最早的節點,即DFS序號最小的節點。根據定義,則有:

Low(u)=Min
{
DFS(u)
DFS(v) (u,v)爲後向邊(返祖邊) 等價於 DFS(v)<DFS(u)且v不爲u的父親節點
Low(v) (u,v)爲樹枝邊(父子邊)
}

一個頂點u是割點,當且僅當滿足(1)或(2)
(1) 若生成樹的根有2棵或2棵以上的子樹,則此根必爲割點。因爲圖中不存在連結不同子樹中頂點的邊,因此刪去根頂點,生成樹變成生成森林。

(2) u不爲樹根,且滿足存在(u,v)爲樹枝邊(或稱父子邊,即u爲v在搜索樹中的父親),使得DFS(u)<=Low(v)。

因爲v不能到達搜索序比u更小的節點,所以,若刪去u,則v所在的子樹和u分離開來。

 

一條無向邊(u,v)是橋,當且僅當(u,v)爲樹枝邊,且滿足DFS(u)<Low(v)。

[求雙連通分支]

下面要分開討論點雙連通分支與邊雙連通分支的求法。

對於點雙連通分支,實際上在求割點的過程中就能順便把每個點雙連通分支求出。建立一個棧,存儲當前雙連通分支,在搜索圖時,每找到一條樹枝邊或後向邊(非橫叉邊),就把這條邊加入棧中。如果遇到某時滿足DFS(u)<=Low(v),說明u是一個割點,同時把邊從棧頂一個個取出,直到遇到了邊(u,v),取出的這些邊與其關聯的點,組成一個點雙連通分支。割點可以屬於多個點雙連通分支,其餘點和每條邊只屬於且屬於一個點雙連通分支。

對於邊雙連通分支,求法更爲簡單。只需在求出所有的橋以後,把橋邊刪除,原圖變成了多個連通塊,則每個連通塊就是一個邊雙連通分支。橋不屬於任何一個邊雙連通分支,其餘的邊和每個頂點都屬於且只屬於一個邊雙連通分支。

[構造雙連通圖]

一個有橋的連通圖,如何把它通過加邊變成邊雙連通圖?方法爲首先求出所有的橋,然後刪除這些橋邊,剩下的每個連通塊都是一個雙連通子圖。把每個雙連通子圖收縮爲一個頂點,再把橋邊加回來,最後的這個圖一定是一棵樹,邊連通度爲1。

統計出樹中度爲1的節點的個數,即爲葉節點的個數,記爲leaf。則至少在樹上添加(leaf+1)/2條邊,就能使樹達到邊二連通,所以至少添加的邊數就是(leaf+1)/2。具體方法爲,首先把兩個最近公共祖先最遠的兩個葉節點之間連接一條邊,這樣可以把這兩個點到祖先的路徑上所有點收縮到一起,因爲一個形成的環一定是雙連通的。然後再找兩個最近公共祖先最遠的兩個葉節點,這樣一對一對找完,恰好是(leaf+1)/2次,把所有點收縮到了一起。

 

 

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