求有向圖的強連通分量除了大家熟知的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的路徑。
另外該演算法具有乙個性質:如果我們把求出來的每個強連通分量縮成乙個點,並且用求出每個強連通分量的順序來標記收縮後的結點,那麼這個順序就是強連通分量縮點後所形成的有向無環圖的拓撲序列。
強連通分量Kosaraju演算法
參考閱讀 如何理解kosaraju演算法?簡緻的回答 知乎 kosaraju演算法步驟 用dfs後序遍歷原圖的反轉圖,得到後序遍歷順序 用得到的後序遍歷順序對原圖dfs 實現 棧和圖的定義 const int maxv 100 定義棧 typedef struct snode stack 定義邊 t...
Kosaraju演算法 強連通分量
有向圖的極大強連通子圖,稱為強連通分量。子圖指的是選取v的乙個子集v 以及e當中所有滿足u,v v 的邊集e 所指代的圖.我們需要找出一幅有向圖當中的所有強連通分量。乙個最樸素的演算法 構造乙個傳遞閉包 也就是陣列aij表示i能否到達j 然後把aij aji 1的節點置於同乙個強連通分量當中 這個演...
強連通分量 Kosaraju
芝士 有向圖強連通分量在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。如圖中1...