1. 程式人生 > >強連通分量(Kosaraju演算法)

強連通分量(Kosaraju演算法)

求有向圖的強連通分量除了大家熟知的trajan,還可以用Kosaraju
先說演算法流程:
1,對原圖dfs一遍,並將出棧順序的逆序作為“偽拓撲序”
2,對原圖夠構反向圖
3,按偽拓撲序在反向圖上dfs,新遍歷到的點都屬於同一個強聯通分量。

正確性證明:
s在反向圖上dfs能夠遍歷到t,說明存在t到s的路徑,而現在需要證明的就是存在s到t的路徑。
我們知道,s的偽拓撲序小於t,也就是s後退棧,有兩種情況:
1,dfs(t)start->dfs(t)end->dfs(s)start->dfs(s)end
2,dfs(s)start->dfs(t)start->dfs(t)end->dfs(s)end
第一種情況t到s不存在路徑,所以只可能是第二種情況,也就是一定存在s到t的路徑。

另外該演算法具有一個性質:如果我們把求出來的每個強連通分量縮成一個點,並且用求出每個強連通分量的順序來標記收縮後的結點,那麼這個順序就是強連通分量縮點後所形成的有向無環圖的拓撲序列。