Implementation 2
import queue
import collections
class Solution:
def top_sort(self, n, dependencies):
"""
:type n: int
:type dependencies: List[List[int]]
:rtype: List[int]
"""
# build graph and its inverse
g = {i:set() for i in range(0, n)}
g_inv = collections.defaultdict(set)
for i, j in dependencies:
g[i].add(j)
g_inv[j].add(i)
# find all empty dependencies
q = queue.Queue()
for course in g:
if not g[course]:
q.put(course)
# begin topological sort algorithm
topo_sort = []
while not q.empty():
# get next independent node
front = q.get()
topo_sort.append(front)
# remove all associated edges
for elm in g_inv[front]:
g[elm].remove(front)
# check if is empty
if not g[elm]:
q.put(elm)
# make sure all elements are included
# otherwise the graph does not have any topological ordering
return topo_sort if len(topo_sort) == n else []
obj = Solution()
print(obj.top_sort(4, [[1, 0], [2, 0], [3, 1], [3, 2]]))
print(obj.top_sort(2, [[0, 1], [1, 0]]))
print(obj.top_sort(2, [[1, 0]]))Last updated