Strongly Connected Components pseudocode:
SCC(G)
- call DFS(G) to compute finishing times f [u] for all u
- compute GT
- call DFS(GT), but in the main loop, consider vertices in order of decreasing f [u] (as computed in first DFS)
- output the vertices in each tree of the depth-first forest formed in second DFS as a separate SCC
#include<cstdio> #include<iostream> #include<vector> #include<algorithm> using namespace std; #define sz 100 vector<int> graph[sz],Gt[sz]; //graph[] store the graph and Gt[] store transpose graph vector<int> topo; int disc[sz],fin[sz],color[sz]; int time=0; void dfs_visit(int node,int flag) { int i,j,k,temp; color[node]=1; if(flag==0) //for the general graph, first dfs call { disc[node]= ++time; for(i=0;i<graph[node].size();i++) { temp=graph[node][i]; if(color[temp]==0) dfs_visit(temp,flag); } fin[node]= ++time; topo.push_back(node); } else //for the transpose graph, second dfs call { printf("%d ",node); for(i=0;i<Gt[node].size();i++) { temp=Gt[node][i]; if(color[temp]==0) dfs_visit(temp,flag); } } color[node]=2; } void dfs(int node,int flag) { int i,j; if(flag==0) //for the general graph, first dfs call { for(i=0;i<node;i++) { if(color[i]==0) dfs_visit(i,flag); } } else //for the transpose graph, second dfs call { for(i=0;i<topo.size();i++) { if(color[topo[i]]==0) { dfs_visit(topo[i],flag); puts(""); } } } } int main() { int i,j,k,num,t,node,edge,a,b; scanf("%d%d",&node,&edge); for(i=0;i<edge;i++) { scanf("%d%d",&a,&b); graph[a].push_back(b); //directed graph Gt[b].push_back(a); //transpose graph } //dfs in graph for(i=0;i<node;i++) color[i]=0; dfs(node,0); //finding topological sort reverse(topo.begin(),topo.end()); //dfs in transpose graph for(i=0;i<node;i++) color[i]=0; dfs(node,1); //connected components will be printed in this call return 0; }