#Topological Sort
'''
1 2 3 4 5
1 ->
2 -> 1
3 -> 1
4 ->
5 -> 3
'''
'''
visited = [1, 2, 3, 4, 5]
ret = [1, 2, 3, 4, 5]
'''
def travel(visited, d, ele):
if ele in visited:
return
if ele in d:
for child in d[ele]:
yield from travel(visited, d, child)
yield ele
visited.add(ele)
def f(array: list, deps: "list of tuple"):
ret = []
visited = set()
d = {}
for v1, v2 in deps:
d[v1] = [v2]
for ele in array:
for n in travel(visited, d, ele):
ret.append(n)
return list(reversed(ret))
result = f (
[1, 2, 3, 4, 5],
[
(2, 1),
(3, 4),
(5, 3)
]
)
print(result)
[5, 3, 4, 2, 1]