Skip to content

Commit 5f6c1c7

Browse files
committedMay 8, 2020
Implemented Kosaraju's algorithm for getting Strongly Connencted Componenets.
1 parent 90956b7 commit 5f6c1c7

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
class Graph
5+
{
6+
int V;
7+
vector<int> *adj;
8+
9+
void fillOrder(int v, bool visited[], stack<int> &s);
10+
11+
void dfsUtil(int v, bool visited[]);
12+
13+
public:
14+
Graph(int V) : V(V)
15+
{
16+
adj = new vector<int>[V];
17+
}
18+
~Graph()
19+
{
20+
delete[] adj;
21+
}
22+
23+
void addEdge(int v, int w);
24+
25+
void printSCCs();
26+
27+
Graph getTranspose();
28+
};
29+
30+
void Graph::dfsUtil(int v, bool visited[])
31+
{
32+
visited[v] = true;
33+
cout << v << " ";
34+
for (auto &it : adj[v])
35+
if (!visited[it])
36+
dfsUtil(it, visited);
37+
}
38+
39+
Graph Graph::getTranspose()
40+
{
41+
Graph g(V);
42+
for (int i = 0; i < V; i++)
43+
{
44+
for (auto &it : adj[i])
45+
g.adj[it].push_back(i);
46+
}
47+
return g;
48+
}
49+
50+
void Graph::addEdge(int v, int w)
51+
{
52+
adj[v].push_back(w);
53+
}
54+
55+
void Graph::fillOrder(int v, bool visited[], stack<int> &s)
56+
{
57+
visited[v] = true;
58+
for (auto &it : adj[v])
59+
if (!visited[it])
60+
fillOrder(it, visited, s);
61+
s.push(v);
62+
}
63+
64+
void Graph::printSCCs()
65+
{
66+
stack<int> s;
67+
bool visited[V] = {0};
68+
for (int i = 0; i < V; i++)
69+
if (!visited[i])
70+
fillOrder(i, visited, s);
71+
72+
Graph gr = getTranspose();
73+
for (int i = 0; i < V; i++)
74+
visited[i] = false;
75+
76+
while (!s.empty())
77+
{
78+
int v = s.top();
79+
s.pop();
80+
if (!visited[v])
81+
{
82+
gr.dfsUtil(v, visited);
83+
cout << "\n";
84+
}
85+
}
86+
}
87+
88+
int main()
89+
{
90+
Graph g(5);
91+
g.addEdge(1, 0);
92+
g.addEdge(0, 2);
93+
g.addEdge(2, 1);
94+
g.addEdge(0, 3);
95+
g.addEdge(3, 4);
96+
97+
cout << "Strongly Connected Components are:\n";
98+
g.printSCCs();
99+
100+
return 0;
101+
}

0 commit comments

Comments
 (0)
Please sign in to comment.