Skip to content

Commit 829b7c8

Browse files
committed
Tarjan's algo in java
1 parent 2fa8452 commit 829b7c8

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
// Java program to find strongly connected components in a given directed graph using Tarjan's algorithm
2+
import java.io.*;
3+
import java.util.*;
4+
5+
6+
public class Graph{
7+
private int V;
8+
9+
10+
private LinkedList<Integer> adj[];
11+
private int Time;
12+
13+
Graph(int v)
14+
{
15+
V = v;
16+
adj = new LinkedList[v];
17+
18+
for(int i = 0; i < v; ++i)
19+
adj[i] = new LinkedList();
20+
21+
Time = 0;
22+
}
23+
24+
25+
void addEdge(int v,int w)
26+
{
27+
adj[v].add(w);
28+
}
29+
30+
31+
void SCCUtil(int u, int low[], int disc[],
32+
boolean stackMember[],
33+
Stack<Integer> st)
34+
{
35+
36+
37+
disc[u] = Time;
38+
low[u] = Time;
39+
Time += 1;
40+
stackMember[u] = true;
41+
st.push(u);
42+
43+
int n;
44+
45+
46+
Iterator<Integer> i = adj[u].iterator();
47+
48+
while (i.hasNext())
49+
{
50+
n = i.next();
51+
52+
if (disc[n] == -1)
53+
{
54+
SCCUtil(n, low, disc, stackMember, st);
55+
56+
57+
low[u] = Math.min(low[u], low[n]);
58+
}
59+
else if (stackMember[n] == true)
60+
{
61+
62+
63+
low[u] = Math.min(low[u], disc[n]);
64+
}
65+
}
66+
67+
68+
int w = -1;
69+
if (low[u] == disc[u])
70+
{
71+
while (w != u)
72+
{
73+
w = (int)st.pop();
74+
System.out.print(w + " ");
75+
stackMember[w] = false;
76+
}
77+
System.out.println();
78+
}
79+
}
80+
81+
82+
void SCC()
83+
{
84+
85+
86+
int disc[] = new int[V];
87+
int low[] = new int[V];
88+
for(int i = 0;i < V; i++)
89+
{
90+
disc[i] = -1;
91+
low[i] = -1;
92+
}
93+
94+
boolean stackMember[] = new boolean[V];
95+
Stack<Integer> st = new Stack<Integer>();
96+
97+
98+
for(int i = 0; i < V; i++)
99+
{
100+
if (disc[i] == -1)
101+
SCCUtil(i, low, disc,
102+
stackMember, st);
103+
}
104+
}
105+
106+
107+
public static void main(String args[])
108+
{
109+
110+
111+
Graph g1 = new Graph(5);
112+
113+
g1.addEdge(1, 0);
114+
g1.addEdge(0, 2);
115+
g1.addEdge(2, 1);
116+
g1.addEdge(0, 3);
117+
g1.addEdge(3, 4);
118+
System.out.println("SSC in first graph ");
119+
g1.SCC();
120+
121+
Graph g2 = new Graph(4);
122+
g2.addEdge(0, 1);
123+
g2.addEdge(1, 2);
124+
g2.addEdge(2, 3);
125+
System.out.println("\nSSC in second graph ");
126+
g2.SCC();
127+
128+
Graph g3 = new Graph(7);
129+
g3.addEdge(0, 1);
130+
g3.addEdge(1, 2);
131+
g3.addEdge(2, 0);
132+
g3.addEdge(1, 3);
133+
g3.addEdge(1, 4);
134+
g3.addEdge(1, 6);
135+
g3.addEdge(3, 5);
136+
g3.addEdge(4, 5);
137+
System.out.println("\nSSC in third graph ");
138+
g3.SCC();
139+
140+
Graph g4 = new Graph(11);
141+
g4.addEdge(0, 1);
142+
g4.addEdge(0, 3);
143+
g4.addEdge(1, 2);
144+
g4.addEdge(1, 4);
145+
g4.addEdge(2, 0);
146+
g4.addEdge(2, 6);
147+
g4.addEdge(3, 2);
148+
g4.addEdge(4, 5);
149+
g4.addEdge(4, 6);
150+
g4.addEdge(5, 6);
151+
g4.addEdge(5, 7);
152+
g4.addEdge(5, 8);
153+
g4.addEdge(5, 9);
154+
g4.addEdge(6, 4);
155+
g4.addEdge(7, 9);
156+
g4.addEdge(8, 9);
157+
g4.addEdge(9, 8);
158+
System.out.println("\nSSC in fourth graph ");
159+
g4.SCC();
160+
161+
Graph g5 = new Graph (5);
162+
g5.addEdge(0, 1);
163+
g5.addEdge(1, 2);
164+
g5.addEdge(2, 3);
165+
g5.addEdge(2, 4);
166+
g5.addEdge(3, 0);
167+
g5.addEdge(4, 2);
168+
System.out.println("\nSSC in fifth graph ");
169+
g5.SCC();
170+
}
171+
}
172+

0 commit comments

Comments
 (0)