我對Kosaraju演算法的理解

Wayne_Kdl發表於2019-12-11

git: github.com/fw103699437…

強連通

在有向圖中,如果v-w存在一條路徑,w-v也存在一條路徑,那麼稱v和w是強連通的。

strong components

在有向圖中,存在一個最大的子集,其中每一個節點都與其他節點是強連通的,這樣的子集叫做 strong connected components,簡稱strong components。

我對Kosaraju演算法的理解

例如,這張圖中: strong components有:
1
0,2,3,4,5
6
7,8
9,10,11,12
環在這裡有很大影響:
一個強連通圖有一個strong component。
一個節點為V的有向無環圖有V個strong components。

kosaraju演算法

1.先將圖反轉,計算反轉圖的逆後序排列
2.按照1中的排列對圖進行深度優先搜尋
3.在同一個遞迴中的深度優先搜尋的節點在一個strong component中

類:
DirectGraph:有向圖
DFSOrder:計算逆後序排列
Kosaraju:Kosaraju演算法
具體程式碼見git。

Kosaraju演算法過程

我對Kosaraju演算法的理解

Kosaraju演算法推導
1.首先證明:如果v與s強連通,那麼v一定在s的dfs遞迴中。
假設節點v不在s的dfs遞迴中,那麼v一定是在以前就被dfs處理過了,但是由於v-s,那麼s會在v存在的遞迴中也被處理過了,那麼s不會被建構函式呼叫。
得證。
2.其次證明:對s進行dfs到達的節點v,一定與s強連通。
整理條件:G中s-v,在GR(G的反向圖,下圖)中v在s的後面
》》:GR中v-s,在GR中v在s的後面
》》:GR中v-s,在GR中v的dfs比s的dfs先結束。
》》:GR中v-s,
a.dfs(v)比dfs(s)先呼叫,先結束。
b.或者dfs(v)比dfs(s)晚呼叫,先結束。
》》:GR中v-s,
a.不可能,因為存在v-s,那麼dfs(v)不會比dfs(s)先結束
b.可能,此時s-v
》》:GR中v-s,s-v
》》:G中s-v,v-s
得證。

我的理解發散: MyCustomKosaraju演算法

由Kosaraju演算法推導可知,只是要製造一種情況,就是v-s,且dfs(v)比dfs(s)先結束。那麼相對於原先的GR中的v-s,dfs(v)比dfs(s)先結束,我們只要在G中s-v,且dfs(s)比dfs(v)先結束就好了。
由於dfs的結束順序是由DFSOrder計算出的逆後序排列,也就是在這個排列中,靠右的比靠左的先結束。我們可以很簡單的把G的後逆序排列反轉,那麼靠左的dfs比靠右的dfs先結束了。
kosaraju演算法
1.先將圖反轉,計算反轉圖的逆後序排列
2.按照1中的排列對圖進行深度優先搜尋
3.在同一個遞迴中的深度優先搜尋的節點在一個strong component中
MyCustomKosaraju演算法
1.計算圖的逆後序排列,反轉逆後續排列
2.按照1中的排列對圖進行深度優先搜尋
3.在同一個遞迴中的深度優先搜尋的節點在一個strong component中

兩者區別在於,反轉圖的逆後序排列 vs 圖的逆後序排列的反轉

MyCustomKosaraju優勢:
1.節省空間
2.理解方便

類:
MyCustomKosaraju
具體程式碼見git。

MyCustomKosaraju演算法推導

1.首先證明:如果v與s強連通,那麼v一定在s的dfs遞迴中。
假設節點v不在s的dfs遞迴中,那麼v一定是在以前就被dfs處理過了,但是由於v-s,那麼s會在v存在的遞迴中也被處理過了,那麼s不會被建構函式呼叫。
得證。
2.其次證明:對s進行dfs到達的節點v,一定與s強連通。
整理條件:G中s-v,在GR(G的反向圖,下圖)中v在s的後面
》》:GR中v-s,在GR中v在s的後面
》》:GR中v-s,在GR中v的dfs比s的dfs先結束。
》》:GR中v-s,
a.dfs(v)比dfs(s)先呼叫,先結束。
b.或者dfs(v)比dfs(s)晚呼叫,先結束。
》》:GR中v-s,
a.不可能,因為存在v-s,那麼dfs(v)不會比dfs(s)先結束
b.可能,此時s-v
》》:GR中v-s,s-v
》》:G中s-v,v-s
得證。

整理條件:G中s-v,在G的後逆序排列的反轉中v在s的後面
》》:G中s-v,dfs(s)比dfs(v)先結束
》》:G中s-v,
a.dfs(s)比dfs(v)先呼叫,先結束。
b.dfs(s)比dfs(v)晚呼叫,先結束。
》》:G中s-v,
a.不可能,因為存在s-v,那麼dfs(s)不會比dfs(v)先結束
b.可能,此時v-s
》》:G中s-v,v-s
得證。

結果演示

我對Kosaraju演算法的理解

相關文章