Kosaraju演算法求有向圖強連通分量。
看了一下,這裡
講得比較詳細。
#include <stdio.h>#include <string.h>#include <vector>using namespace std;/*num[]記錄訪問頂點序列stc[]記錄頂點所屬連通分支E1[]原圖E2[]反圖visited[]雜湊已訪問頂點*/const int MaxN = 101;typedef vector < int > edge;edgeE1[MaxN] , E2[MaxN];int num[MaxN] , stc[MaxN] , cnt;bool visited[MaxN];void DFS(int vex){visited[vex] = true;for (int i = 0;i < E1[vex].size();i ++){if (!visited[E1[vex][i]]){DFS(E1[vex][i]);}}num[cnt ++] = vex;}void DFS(int vex , const int &anc){visited[vex] = true;stc[vex] = anc;for (int i = 0;i < E2[vex].size();i ++){if (!visited[E2[vex][i]]){DFS(E2[vex][i] , anc);}}}void init(){cnt = 0;int i , j , n , m , a , b;scanf("%d%d" , &n , &m);for (i = 0;i < n;i ++){E1[i].clear();E2[i].clear();visited[i] = 0;}for (i = 0;i < m;i ++){scanf("%d%d" , &a , &b);E1[a].push_back(b);E2[b].push_back(a);}for (i = 0;i < n;i ++){if (!visited[i]){DFS(i);}}memset(visited , 0 , sizeof(visited));for (i = n - 1;i >= 0;i --){if (!visited[num[i]])DFS(num[i] , num[i]);}}void __test(){init();puts("各頂點所屬的強連通分量:");for (int i = 0;i < cnt;i ++){printf("%d " , stc[i]);}puts("");}int main(){__test();}/*9 80 11 21 42 70 33 55 60 84 70 10 32 02 12 33 03 2*/