半連通的定義,有向圖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的拓撲序列,然後只要驗證相鄰的結點是否均有邊即可。