Kosaraju縮點演算法詳解

2021-08-22 04:47:37 字數 1104 閱讀 7743

相對於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...