Skip to content

Commit df3e759

Browse files
author
Hamid Gasmi
committed
Issue #97 is completed
1 parent 34747aa commit df3e759

File tree

12 files changed

+94
-8
lines changed

12 files changed

+94
-8
lines changed

3-graph-algorithms/1_graph_decomposition/strongly_connected.py

+48-8
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,58 @@
22

33
sys.setrecursionlimit(200000)
44

5-
def number_of_strongly_connected_components(adj):
6-
result = 0
7-
#write your code here
8-
return result
5+
class Graph:
6+
def __init__(self, n, edges):
7+
self.visited = [False] * n
8+
self.adj = [[] for _ in range(n)]
9+
self.adjReverse = [[] for _ in range(n)]
10+
self.buildAdjacencyList(edges)
11+
12+
# Time Complexity: O(|E|)
13+
# Space Complexity: O(1)
14+
def buildAdjacencyList(self, edges):
15+
for (a, b) in edges:
16+
self.adj[a - 1].append(b - 1)
17+
self.adjReverse[b - 1].append(a - 1)
18+
19+
def explore(self, v, adj, postOrderVisits):
20+
self.visited[v] = True
21+
for a in adj[v]:
22+
if not self.visited[a]:
23+
self.explore(a, adj, postOrderVisits)
24+
25+
postOrderVisits.append(v)
26+
27+
def dfs(self, adj, postOrderVisits):
28+
self.visited = [False] * n
29+
for v in range(len(adj)):
30+
if not self.visited[v]:
31+
self.explore(v, adj, postOrderVisits)
32+
33+
def number_of_strongly_connected_components(self):
34+
35+
postOrderVisits = []
36+
self.dfs(self.adjReverse, postOrderVisits)
37+
self.visited = [False] * n
38+
aSCCList = []
39+
for i in range(len(postOrderVisits) - 1, -1, -1):
40+
v = postOrderVisits[i]
41+
if not self.visited[v]:
42+
aSCC = []
43+
self.explore(v, self.adj, aSCC)
44+
aSCCList.append(aSCC)
45+
46+
return aSCCList
47+
48+
def number_of_strongly_connected_components(n, edges):
49+
aGraph = Graph(n, edges=edges)
50+
51+
return len(aGraph.number_of_strongly_connected_components())
952

1053
if __name__ == '__main__':
1154
input = sys.stdin.read()
1255
data = list(map(int, input.split()))
1356
n, m = data[0:2]
1457
data = data[2:]
1558
edges = list(zip(data[0:(2 * m):2], data[1:(2 * m):2]))
16-
adj = [[] for _ in range(n)]
17-
for (a, b) in edges:
18-
adj[a - 1].append(b - 1)
19-
print(number_of_strongly_connected_components(adj))
59+
print(number_of_strongly_connected_components(n, edges))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
6 7
2+
1 2
3+
2 3
4+
3 1
5+
1 4
6+
4 5
7+
5 6
8+
6 4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
6 7
2+
1 3
3+
3 2
4+
2 1
5+
6 3
6+
6 5
7+
5 4
8+
4 6
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
10 20
2+
7 8
3+
4 10
4+
3 2
5+
1 3
6+
4 9
7+
2 6
8+
8 3
9+
8 2
10+
6 1
11+
6 10
12+
10 6
13+
1 4
14+
3 8
15+
1 5
16+
8 9
17+
5 3
18+
3 4
19+
5 1
20+
8 5
21+
8 4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3

0 commit comments

Comments
 (0)