|
2 | 2 |
|
3 | 3 | sys.setrecursionlimit(200000)
|
4 | 4 |
|
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()) |
9 | 52 |
|
10 | 53 | if __name__ == '__main__':
|
11 | 54 | input = sys.stdin.read()
|
12 | 55 | data = list(map(int, input.split()))
|
13 | 56 | n, m = data[0:2]
|
14 | 57 | data = data[2:]
|
15 | 58 | 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)) |
0 commit comments