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.演算法思路 基本思路 這個演算法可以說是最容易理解,最通用的演算法,其比較關鍵的部分是同時應用了原圖...