Kosaraju算法
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #define maxn 10005 using namespace std; vector<int> G[maxn],Gt[maxn]; //Gt存放补图 vector<int> S; int vis[maxn]; int sccno[maxn]; //每个节点所在强连通分量的序号 int scc_cnt; //强连通分量个数 int outdegree[maxn]; //连通分量的出度 void dfs1(int u){ //目的,按每个节点结束搜索的时间排序 if(vis[u]) return; vis[u] = 1; for(int i = 0;i < G[u].size();i ++){ dfs1(G[u][i]); } S.push_back(u); } void dfs2(int u){ if(sccno[u]) return; sccno[u] = scc_cnt; for(int i = 0;i < Gt[u].size();i ++){ dfs2(Gt[u][i]); } } void find_scc(int n){ S.clear(); scc_cnt = 0; memset(sccno,0,sizeof(sccno)); memset(vis,0,sizeof(vis)); memset(outdegree,0,sizeof(outdegree)); for(int i = 1;i <= n;i ++){ dfs1(i); } for(int i = n-1;i >= 0 ;i --){ if(!sccno[S[i]]){ scc_cnt ++; dfs2(S[i]); } } }