【拓扑 && 模板】Kosaraju算法
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1000; 4 vector <int> g1[maxn],g2[maxn]; 5 stack <int> s; 6 int vis[maxn],sccno[maxn],cnt; 7 void dfs1(int u){ 8 if(vis[u]) return ; 9 vis[u]=1; 10 for(int i=0;i<g1[u].size();i++) 11 dfs1(g1[u][i]); 12 s.push(u); 13 } 14 15 void dfs2(int u){ 16 if(sccno[u]) return ; 17 sccno[u]=cnt; 18 for(int i=0;i<=g2[u].size();i++) 19 dfs2(g2[u][i]); 20 } 21 22 void KK(int n){ 23 cnt=0; 24 while (!s.empty()) s.pop(); 25 memset(sccno,0, sizeof(sccno)); 26 memset(vis, 0, sizeof(vis)); 27 for(int i=0;i<n;i++){ 28 dfs1(i); 29 } 30 while(!s.empty()){ 31 if(!sccno[s.top()]){ 32 cnt++; 33 dfs2(s.top()); 34 } 35 s.pop(); 36 } 37 } 38 int main(){ 39 40 return 0; 41 }
“胡须如草芥疯长,悲欢不过梦一场”