算法導論22.5-7 給出一個算法確定一個有向圖是否爲半連通

半連通的定義,有向圖G(V,E),任意兩個不同的點u、v,u有一條路徑可達v或者v有一條路徑可達u,從定義中可以看出,強連通圖一定是半連通的。


引理:有向無環圖G(V,E),G是半連通的當且僅當有一條路徑,這條路徑上有圖G中所有點。

證明:充分性很顯然,如果有這樣一條路徑,則任意兩個點之間都有一條路徑。

必要性,有向無環圖,可以對其進行拓撲排序得到一個拓撲序列,拓撲序列中任意兩個相鄰的結點u,v,由半連通的定義可知,要麼v~u,要麼u~v,以下爲圖G的拓撲序列。

.....u,v................

(1) v~u,即有一條v到u的路徑,而根據拓撲排序的屬性,任意一條邊只能從左邊到右邊,故從v無論如何都不能到達u

(2)u~v,即有一條從u到v的路徑,如果沒有邊(u,v),u只能指向v之後的結點,根據拓撲排序的屬性,任意一條邊只能從左邊到右邊,故u不到達到v與半連通矛盾,故一定存在邊(u,v)。

與是拓撲序列的任意兩個相鄰結點之間均有邊,則這個拓撲序列就是這樣的一條路徑,其中包含圖G的所有結點。

 

對於任意圖G,只需要將其轉化爲有向無環圖(DAG),即通過強連通分支算法獲取圖G的連通分支圖GSCC,分支圖GSCC一定是有向無環圖,故可以使用引理來確定是否爲半連通。使用kosaraju 算法,因爲此算法第二次DFS正好得到GSCC的拓撲序列,然後只要驗證相鄰的結點是否均有邊即可。

發佈了72 篇原創文章 · 獲贊 28 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章