Skip to content

Commit 0c810a4

Browse files
Merge pull request #116 from ashish1500616/TarjansAlgorithm
#55 Implementation of Tarajan's Algorithm In cpp.
2 parents 5b1d601 + 9877da0 commit 0c810a4

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

Graph/TarganSCC/TarjansAlgorithm.cpp

+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
#include<iostream>
2+
#include <list>
3+
#include <stack>
4+
#define NIL -1
5+
using namespace std;
6+
7+
class Graph
8+
{
9+
int V;
10+
list<int> *adj;
11+
12+
13+
void SCCUtil(int u, int disc[], int low[],
14+
stack<int> *st, bool stackMember[]);
15+
public:
16+
Graph(int V);
17+
void addEdge(int v, int w);
18+
void SCC();
19+
};
20+
21+
Graph::Graph(int V)
22+
{
23+
this->V = V;
24+
adj = new list<int>[V];
25+
}
26+
27+
void Graph::addEdge(int v, int w)
28+
{
29+
adj[v].push_back(w);
30+
}
31+
32+
33+
void Graph::SCCUtil(int u, int disc[], int low[], stack<int> *st,
34+
bool stackMember[])
35+
{
36+
37+
static int time = 0;
38+
39+
disc[u] = low[u] = ++time;
40+
st->push(u);
41+
stackMember[u] = true;
42+
43+
44+
list<int>::iterator i;
45+
for (i = adj[u].begin(); i != adj[u].end(); ++i)
46+
{
47+
int v = *i;
48+
49+
50+
if (disc[v] == -1)
51+
{
52+
SCCUtil(v, disc, low, st, stackMember);
53+
54+
55+
low[u] = min(low[u], low[v]);
56+
}
57+
58+
59+
else if (stackMember[v] == true)
60+
low[u] = min(low[u], disc[v]);
61+
}
62+
63+
64+
int w = 0;
65+
if (low[u] == disc[u])
66+
{
67+
while (st->top() != u)
68+
{
69+
w = (int) st->top();
70+
cout << w << " ";
71+
stackMember[w] = false;
72+
st->pop();
73+
}
74+
w = (int) st->top();
75+
cout << w << "n";
76+
stackMember[w] = false;
77+
st->pop();
78+
}
79+
}
80+
void Graph::SCC()
81+
{
82+
int *disc = new int[V];
83+
int *low = new int[V];
84+
bool *stackMember = new bool[V];
85+
stack<int> *st = new stack<int>();
86+
87+
88+
for (int i = 0; i < V; i++)
89+
{
90+
disc[i] = NIL;
91+
low[i] = NIL;
92+
stackMember[i] = false;
93+
}
94+
95+
96+
for (int i = 0; i < V; i++)
97+
if (disc[i] == NIL)
98+
SCCUtil(i, disc, low, st, stackMember);
99+
}
100+
101+
int main()
102+
{
103+
cout << "nSCCs in first graph n";
104+
Graph g1(5);
105+
g1.addEdge(1, 0);
106+
g1.addEdge(0, 2);
107+
g1.addEdge(2, 1);
108+
g1.addEdge(0, 3);
109+
g1.addEdge(3, 4);
110+
g1.SCC();
111+
112+
cout << "nSCCs in second graph n";
113+
Graph g2(4);
114+
g2.addEdge(0, 1);
115+
g2.addEdge(1, 2);
116+
g2.addEdge(2, 3);
117+
g2.SCC();
118+
119+
cout << "nSCCs in third graph n";
120+
Graph g3(7);
121+
g3.addEdge(0, 1);
122+
g3.addEdge(1, 2);
123+
g3.addEdge(2, 0);
124+
g3.addEdge(1, 3);
125+
g3.addEdge(1, 4);
126+
g3.addEdge(1, 6);
127+
g3.addEdge(3, 5);
128+
g3.addEdge(4, 5);
129+
g3.SCC();
130+
131+
cout << "nSCCs in fourth graph n";
132+
Graph g4(11);
133+
g4.addEdge(0,1);g4.addEdge(0,3);
134+
g4.addEdge(1,2);g4.addEdge(1,4);
135+
g4.addEdge(2,0);g4.addEdge(2,6);
136+
g4.addEdge(3,2);
137+
g4.addEdge(4,5);g4.addEdge(4,6);
138+
g4.addEdge(5,6);g4.addEdge(5,7);g4.addEdge(5,8);g4.addEdge(5,9);
139+
g4.addEdge(6,4);
140+
g4.addEdge(7,9);
141+
g4.addEdge(8,9);
142+
g4.addEdge(9,8);
143+
g4.SCC();
144+
145+
cout << "nSCCs in fifth graph n";
146+
Graph g5(5);
147+
g5.addEdge(0,1);
148+
g5.addEdge(1,2);
149+
g5.addEdge(2,3);
150+
g5.addEdge(2,4);
151+
g5.addEdge(3,0);
152+
g5.addEdge(4,2);
153+
g5.SCC();
154+
155+
return 0;
156+
}

0 commit comments

Comments
 (0)