1. 程式人生 > >圖的割點、橋和雙連通分支的基本概念

圖的割點、橋和雙連通分支的基本概念

ACM模版

點連通度與邊連通度

在一個無向連通圖中,如果有一個頂點集合,刪除這個頂點集合,以及這個集合中所有頂點相關聯的邊以後,原圖變成多個連通塊,就稱這個點集為割點集合。一個圖的點連通度的定義為,最小割點集合中的頂點數。 類似的,如果有一個邊集合,刪除這個邊集合以後,原圖變成多個連通塊,就稱這個點集為割邊集合。一個圖的邊連通度的定義為,最小割邊集合中的邊數。

雙連通圖、割點與橋

如果一個無向連通圖的點連通度大於1,則稱該圖是點雙連通的(point biconnected),簡稱雙連通或重連通。一個圖有割點,當且僅當這個圖的點連通度為1,則割點集合的唯一元素被稱為割點(cut point),又叫關節 點(articulation point)。如果一個無向連通圖的邊連通度大於1,則稱該圖是邊雙連通的(edge biconnected),簡稱雙連通或重連通。一個圖有橋,當且僅當這個圖的邊連通度為 1,則割邊集合的唯一元素被稱為橋(bridge),又叫關節邊 (articulation edge)。

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

雙連通分支

在圖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)u為樹根,且u有多於一個子樹。(2)u不為樹根,且滿足存在(u,v)為樹枝邊(或稱父子邊,即u為v在搜尋樹中的父親),使得 DFS(u) <= Low(v)。一條無向邊(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 次,把所有點收縮到了一起。