求解圖的強(qiáng)連通分量的方法(一):Kosaraju算法

一. 基本原理

圖1

如圖,圖中包含了3個(gè)強(qiáng)連通分量(簡(jiǎn)稱SCC,下同),從左到右分別設(shè)為S_1, S_2, S_3, 則可以抽象為下面的圖2,一個(gè)圈代表一個(gè)SCC

圖2

注意到,如果把一個(gè)SCC當(dāng)作一個(gè)結(jié)點(diǎn),則這個(gè)圖為有向無環(huán)圖,即僅存在從S_1S_3的有向邊,不存在從S_3S_1的邊,否則S_1和S_3同屬一個(gè)強(qiáng)連通分量

所以我們只需要用DFS遍歷,并使得圖遍歷的順序?yàn)?S_2 \rightarrow S_3 \rightarrow S_1, 就可以分別遍歷S_1,S_2,S_3的所有結(jié)點(diǎn)

回到圖1,設(shè)訪問每個(gè)強(qiáng)聯(lián)通分量時(shí)第一個(gè)訪問的結(jié)點(diǎn)為這個(gè)強(qiáng)連通分量的leader,我們只要找到一個(gè)方法使得DFS訪問的結(jié)點(diǎn)順序?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=leader(S_1)%20%5Cto%20leader(S_2)%20%5Cto%20leader(S_3)" alt="leader(S_1) \to leader(S_2) \to leader(S_3)" mathimg="1">即可

則問題轉(zhuǎn)變?yōu)槿绾握业揭粋€(gè)訪問leader的順序,使得被指向的SCC先訪問
按照DFS訪問圖1的時(shí)候有以下性質(zhì)

  • 一個(gè)SCC的leader總是最先訪問,并且最后訪問結(jié)束(遍歷完所有后繼結(jié)點(diǎn))
  • 如果有S_1 \to S_2S_2的leader總是先訪問結(jié)束

如果建立一個(gè)棧finishstack,如果結(jié)點(diǎn)訪問結(jié)束,將其push入棧中,則在finishstack 中pop出來的結(jié)點(diǎn)順序我們就稱為后逆序,這個(gè)后逆序滿足先訪問結(jié)束的SCC的leader 順序先于后訪問結(jié)束的SCC的leader。

如果用leader結(jié)點(diǎn)代替相應(yīng)的SCC,那么后逆序就是用DFS訪問leader的順序

并且,有一個(gè)引理

  • 對(duì)圖G求逆得到的G^T和原圖的SCC相同

所以只要利用DFS訪問G^T,得到后逆序,然后再利用DFS按照后逆序訪問圖G,就可以使得G中被指向的SCC先訪問,最終DFS訪問得到的一個(gè)連通分量就是一個(gè)SCC

二. 方法概述

  1. 對(duì)原圖取反,從任意一個(gè)頂點(diǎn)開始對(duì)反向圖G^T進(jìn)行DFS遍歷,將訪問結(jié)束的頂點(diǎn)加入finish\_stack
  2. 按照finish\_stack中頂點(diǎn)出棧順序,對(duì)原圖G進(jìn)行DFS遍歷,一次DFS遍歷中訪問的所有頂點(diǎn)都屬于同一強(qiáng)連通分量。

三. 例子

找出圖G中的強(qiáng)連通分量


G

第一步:求出G^T

GT.png

第二步:求出后逆序
由A開始并按照字母序進(jìn)行DFS遍歷,并求出finish\_stack
訪問順序?yàn)?A G B C H D I F E
得到的finish \_ stack為 C B D H F I G A E

第三步: 按照后逆序訪問原圖G
出棧順序(后逆序)為 E A G I F H D B C
所以按照這個(gè)順序?qū)進(jìn)行DFS遍歷, 訪問的得到的結(jié)果是(一行為一次DFS遍歷得到的連通圖)
訪問 E:{E}
訪問 A:{A B G F I}
訪問 H:{H}
訪問 D:{D}
訪問 C:{C}

所以得到五個(gè)連通圖:{E}, {A B G F I}, {H}, {D}, {C}

四. 偽代碼

  1. 獲得finishstack后的原圖遍歷
圖3.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容