Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // C++ Implementation of Kosaraju's algorithm to print all SCCs
- #include <bits/stdc++.h>
- using namespace std;
- int nodes,edges;
- vector <int> adj[5],transposed_adj[5];
- void DFSUtil(int v, bool visited[])
- {
- visited[v] = true;
- cout << v << " ";
- vector <int>::iterator i;
- for (i = transposed_adj[v].begin(); i != transposed_adj[v].end(); ++i)
- if (!visited[*i])
- DFSUtil(*i, visited);
- }
- void addEdge(int v, int w)
- {
- adj[v].push_back(w);
- transposed_adj[w].push_back(v);
- }
- void fillOrder(int v, bool visited[], stack<int> &Stack)
- {
- visited[v] = true;
- vector <int>::iterator i;
- for(i = adj[v].begin(); i != adj[v].end(); ++i)
- if(!visited[*i])
- fillOrder(*i, visited, Stack);
- Stack.push(v);
- }
- void printSCCs()
- {
- stack <int> Stack;
- bool visited[nodes];
- for(int i = 0; i < nodes; i++)
- visited[i] = false;
- for(int i = 0; i < nodes; i++)
- if(visited[i] == false)
- fillOrder(i, visited, Stack);
- for(int i = 0; i < nodes; i++)
- visited[i] = false;
- while (!Stack.empty())
- {
- int cur = Stack.top();
- Stack.pop();
- if (visited[cur] == false)
- {
- DFSUtil(cur, visited);
- cout << endl;
- }
- }
- }
- int main()
- {
- cin>>nodes>>edges;
- int v,w;
- for (int i=0;i<edges;i++)
- {
- cin>>v>>w;
- addEdge(v,w);
- }
- cout << "Following are strongly connected components in "
- "given graph \n";
- printSCCs();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement