图的割点、桥与双连通分支
[點(diǎn)連通度與邊連通度]
在一個(gè)無(wú)向連通圖中,如果有一個(gè)頂點(diǎn)集合,刪除這個(gè)頂點(diǎn)集合,以及這個(gè)集合中所有頂點(diǎn)相關(guān)聯(lián)的邊以后,原圖變成多個(gè)連通塊,就稱(chēng)這個(gè)點(diǎn)集為割點(diǎn)集合。一個(gè)圖的點(diǎn)連通度的定義為,最小割點(diǎn)集合中的頂點(diǎn)數(shù)。
類(lèi)似的,如果有一個(gè)邊集合,刪除這個(gè)邊集合以后,原圖變成多個(gè)連通塊,就稱(chēng)這個(gè)點(diǎn)集為割邊集合。一個(gè)圖的邊連通度的定義為,最小割邊集合中的邊數(shù)。
[雙連通圖、割點(diǎn)與橋]
如果一個(gè)無(wú)向連通圖的點(diǎn)連通度大于1,則稱(chēng)該圖是點(diǎn)雙連通的(point biconnected),簡(jiǎn)稱(chēng)雙連通或重連通。一個(gè)圖有割點(diǎn),當(dāng)且僅當(dāng)這個(gè)圖的點(diǎn)連通度為1,則割點(diǎn)集合的唯一元素被稱(chēng)為割點(diǎn)(cut point),又叫關(guān)節(jié)點(diǎn)(articulation point)。
如果一個(gè)無(wú)向連通圖的邊連通度大于1,則稱(chēng)該圖是邊雙連通的(edge biconnected),簡(jiǎn)稱(chēng)雙連通或重連通。一個(gè)圖有橋,當(dāng)且僅當(dāng)這個(gè)圖的邊連通度為1,則割邊集合的唯一元素被稱(chēng)為橋(bridge),又叫關(guān)節(jié)邊(articulation edge)。
可以看出,點(diǎn)雙連通與邊雙連通都可以簡(jiǎn)稱(chēng)為雙連通,它們之間是有著某種聯(lián)系的,下文中提到的雙連通,均既可指點(diǎn)雙連通,又可指邊雙連通。
[雙連通分支]
在圖G的所有子圖G'中,如果G'是雙連通的,則稱(chēng)G'為雙連通子圖。如果一個(gè)雙連通子圖G'它不是任何一個(gè)雙連通子圖的真子集,則G'為極大雙連通子圖。雙連通分支(biconnected component),或重連通分支,就是圖的極大雙連通子圖。特殊的,點(diǎn)雙連通分支又叫做塊。
[求割點(diǎn)與橋]
該算法是R.Tarjan發(fā)明的。對(duì)圖深度優(yōu)先搜索,定義DFS(u)為u在搜索樹(shù)(以下簡(jiǎn)稱(chēng)為樹(shù))中被遍歷到的次序號(hào)。定義Low(u)為u或u的子樹(shù)中能通過(guò)非父子邊追溯到的最早的節(jié)點(diǎn),即DFS序號(hào)最小的節(jié)點(diǎn)。根據(jù)定義,則有:
Low(u)=Min { DFS(u) DFS(v) (u,v)為后向邊(返祖邊) 等價(jià)于 DFS(v)<DFS(u)且v不為u的父親節(jié)點(diǎn) Low(v) (u,v)為樹(shù)枝邊(父子邊) }
一個(gè)頂點(diǎn)u是割點(diǎn),當(dāng)且僅當(dāng)滿(mǎn)足(1)或(2) (1) u為樹(shù)根,且u有多于一個(gè)子樹(shù)。 (2) u不為樹(shù)根,且滿(mǎn)足存在(u,v)為樹(shù)枝邊(或稱(chēng)父子邊,即u為v在搜索樹(shù)中的父親),使得DFS(u)<=Low(v)。
一條無(wú)向邊(u,v)是橋,當(dāng)且僅當(dāng)(u,v)為樹(shù)枝邊,且滿(mǎn)足DFS(u)<Low(v)。
[求雙連通分支]
下面要分開(kāi)討論點(diǎn)雙連通分支與邊雙連通分支的求法。
對(duì)于點(diǎn)雙連通分支,實(shí)際上在求割點(diǎn)的過(guò)程中就能順便把每個(gè)點(diǎn)雙連通分支求出。建立一個(gè)棧,存儲(chǔ)當(dāng)前雙連通分支,在搜索圖時(shí),每找到一條樹(shù)枝邊或后向邊(非橫叉邊),就把這條邊加入棧中。如果遇到某時(shí)滿(mǎn)足DFS(u)<=Low(v),說(shuō)明u是一個(gè)割點(diǎn),同時(shí)把邊從棧頂一個(gè)個(gè)取出,直到遇到了邊(u,v),取出的這些邊與其關(guān)聯(lián)的點(diǎn),組成一個(gè)點(diǎn)雙連通分支。割點(diǎn)可以屬于多個(gè)點(diǎn)雙連通分支,其余點(diǎn)和每條邊只屬于且屬于一個(gè)點(diǎn)雙連通分支。
對(duì)于邊雙連通分支,求法更為簡(jiǎn)單。只需在求出所有的橋以后,把橋邊刪除,原圖變成了多個(gè)連通塊,則每個(gè)連通塊就是一個(gè)邊雙連通分支。橋不屬于任何一個(gè)邊雙連通分支,其余的邊和每個(gè)頂點(diǎn)都屬于且只屬于一個(gè)邊雙連通分支。
[構(gòu)造雙連通圖]
一個(gè)有橋的連通圖,如何把它通過(guò)加邊變成邊雙連通圖?方法為首先求出所有的橋,然后刪除這些橋邊,剩下的每個(gè)連通塊都是一個(gè)雙連通子圖。把每個(gè)雙連通子圖收縮為一個(gè)頂點(diǎn),再把橋邊加回來(lái),最后的這個(gè)圖一定是一棵樹(shù),邊連通度為1。
統(tǒng)計(jì)出樹(shù)中度為1的節(jié)點(diǎn)的個(gè)數(shù),即為葉節(jié)點(diǎn)的個(gè)數(shù),記為leaf。則至少在樹(shù)上添加(leaf+1)/2條邊,就能使樹(shù)達(dá)到邊二連通,所以至少添加的邊數(shù)就是(leaf+1)/2。具體方法為,首先把兩個(gè)最近公共祖先最遠(yuǎn)的兩個(gè)葉節(jié)點(diǎn)之間連接一條邊,這樣可以把這兩個(gè)點(diǎn)到祖先的路徑上所有點(diǎn)收縮到一起,因?yàn)橐粋€(gè)形成的環(huán)一定是雙連通的。然后再找兩個(gè)最近公共祖先最遠(yuǎn)的兩個(gè)葉節(jié)點(diǎn),這樣一對(duì)一對(duì)找完,恰好是(leaf+1)/2次,把所有點(diǎn)收縮到了一起。
[圖的雙連通性問(wèn)題例題]
備用交換機(jī)?求圖的割點(diǎn),直接輸出。
總結(jié)
以上是生活随笔為你收集整理的图的割点、桥与双连通分支的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。