強聯通分量 kosaraju

2021-07-06 10:25:50 字數 1184 閱讀 8781

kosaraju演算法思想:利用了這個特點:如果原圖中u,v同屬於乙個強聯通分量,則逆圖(原圖所有的邊反向)u,v同屬於乙個強聯通分量。

1.dfs原圖按照dfs返回的時間記錄節點的訪問順序time[t].

2.每次從time選擇離開最晚的節點,在逆圖中進行dfs,該節點能遍歷到的節點位於同一強聯通分量,並刪除逆圖中這些節點。

3.直到time中沒有節點。

下面是兩種不同儲存結構的實現

鄰接表:

#include #include#define node 100

using namespace std;

struct edge

edge[node*node];

int head[node][2];

int visit[node];

int time[node];

int t=0,n,cnt=0;

void addedge(int u,int v,int w) //鄰接表構建圖與逆圖

void dfs1(int u)

}t+=1;

time[t]=u; 所有節點的dfs時間都在其子節點之後,這裡暗含了按時間排序的過程

}void dfs2(int u)

kosaraju();

}return 0;

}

鄰接矩陣

#include #include#define max 0x3fffffff

#define node 100

using namespace std;

int matrix[node][node];

int matrixt[node][node];

int visit[node];

int time[node];

int t=0,n;

void dfs1(int u)

}t+=1;

time[t]=u;

}void dfs2(int u)

else}}

int s,e,c;

for(int i=1;i<=m;i++)

kosaraju();

}return 0;

}

CSP 強聯通分量和Kosaraju實現

題目簡述 題目重述 思路概述 題目原始碼 強聯通分量是圖論的常見概念之一,強聯通問題也是圖論演算法題中常見的題目。但由於學習強聯通分量問題需要有一定的知識基礎,我們分成三個部分講解。void dfs int st vec back.push back st 後序序列 強聯通分量的基礎定義在此我們也做...

強連通分量 Kosaraju

芝士 有向圖強連通分量在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。如圖中1...

強聯通分量

有向圖中 u可達 v不一定意味著v可達 u.相互可達則屬於同乙個強連通分量 strongly connected component,scc 最關鍵通用部分 強連通分量一定是圖的深搜樹的乙個子樹。1.演算法思路 基本思路 這個演算法可以說是最容易理解,最通用的演算法,其比較關鍵的部分是同時應用了原圖...