tg_sort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

from collections import deque
from itertools import filterfalse

class Graph:
def __init__(self, num_vertices: int):
self._num_vertices = num_vertices
self._adjacency = [[] for _ in range(num_vertices)]

def add_edge(self, s: int, t: int) -> None:
self._adjacency[s].append(t)

def tsort_by_kahn(self) -> None:
in_degree = [0] * self._num_vertices
for v in range(self._num_vertices):
if len(self._adjacency[v]):
for neighbour in self._adjacency[v]:
in_degree[neighbour] += 1
q = deque(filterfalse(lambda x: in_degree[x], range(self._num_vertices)))
while q:
v = q.popleft()
print(f"{v} -> ", end="")
for neighbour in self._adjacency[v]:
in_degree[neighbour] -= 1
if not in_degree[neighbour]:
q.append(neighbour)
print("\b\b\b ")

def tsort_by_dfs(self) -> None:
inverse_adjacency = [[] for _ in range(self._num_vertices)]
for v in range(self._num_vertices):
if len(self._adjacency[v]):
for neighbour in self._adjacency[v]:
inverse_adjacency[neighbour].append(v)
visited = [False] * self._num_vertices

def dfs(vertex: int) -> None:
if len(inverse_adjacency[vertex]):
for v in inverse_adjacency[vertex]:
if not visited[v]:
visited[v] = True
dfs(v)
print(f"{vertex} -> ", end="")

for v in range(self._num_vertices):
if not visited[v]:
visited[v] = True
dfs(v)

print("\b\b\b ")


if __name__ == "__main__":

dag = Graph(4)
dag.add_edge(1, 0)
dag.add_edge(2, 1)
dag.add_edge(1, 3)
dag.tsort_by_kahn()
dag.tsort_by_dfs()