相對於tarjan演算法,kosaraju演算法更容易理解,原理非常簡單,就是對一張有向圖進行兩次dfs遍歷。
下面我們用一張圖作為例項,講解kosaraju演算法的實現過程:
這是一張有向圖,對於強連通分量,我們一眼就看出來了,而機器有沒有眼睛,那怎麼識別呢?
首先我們以從一號到五號節點順序進行dfs,我們用dfn陣列記錄dfs訪問退出的記錄。
遍歷之後記錄,我們記錄下先後退出記錄為 [5][3][2][4][1]。
然後我們對圖的邊反向,得到反圖:
我們用得到dfn陣列按照反向順序再次遍歷這張反圖,同次dfs遍歷到的點的集合是乙個強連通分量。
若這樣還是不懂,我們繼續模擬過程:
我們以[1][4][2][3][5]的順序對反圖dfs。
我們以1為起點遍歷,得到集合,是乙個強連通分量。
我們後面再以2為起點遍歷,得到集合,也是乙個強連通分量,這樣,我們的演算法就實現了。
上傳我本人的**:
#includeusing namespace std;
struct nodeedge1[100010],edge2[100010];
int en,n,m,head1[100010],head2[100010];
bool vis[100010];
int dfn[100010],col[100010],cnt;
//dfn記錄第幾個退出。
void add(int u,int v)
void dfs(int s)
void dfs(int s,int k)
void kosaraju()
kosaraju();
return 0;}/*
輸入:5 7
1 23 5
5 22 3
1 51 4
4 1輸出:
1 42 5 3
*/
班長競選(kosaraju縮點
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...
演算法詳解之縮點
縮點。顧名思義,就是在圖論演算法中將一些點縮成乙個點的一種演算法。貌似明白了,但是這有什麼用呢?我們經常求最短路,但是如果我們要求最長路呢?標準問法 給你一張有向圖,每個點都有乙個點權 不是邊權了哦 且每乙個點都可以經過任意多次,但是點權只能加一次,求這張圖的最大權值 題目分析 看到這,相信大多數人...
kosaraju演算法應用(一)
poj 2186 解題思路 kosaraju演算法,本以為要縮點,但是題目只要求找到拓撲排序的乙個唯一的頭,可以水過 通過計算強連通分量的出度。include include include include include using namespace std int n,m,v 10005 nu...