Lam NguyenLibrary

Library · Graphs · topological order

Topological Sort

Code ↗
from collections import deque


# Kahn's algorithm on g[u] = list of v for edges u -> v; [] if there is a cycle
def topo_sort(g: list) -> list:
    n = len(g)
    indeg = [0] * n
    for u in range(n):
        for v in g[u]: indeg[v] += 1
    q = deque(u for u in range(n) if indeg[u] == 0)
    order = []
    while q:
        u = q.popleft()
        order.append(u)
        for v in g[u]:
            indeg[v] -= 1
            if indeg[v] == 0: q.append(v)
    return order if len(order) == n else []