Topological Sort

Graph Selection

Playback Controls

Select a graph to begin topological sorting

Topological Sort Info

Requirements:

  • • Must be a DAG (no cycles)
  • • Directed edges only
  • • Linear ordering of vertices
  • • Edge u→v means u comes before v

Algorithm Comparison:

Kahn's: BFS-based, in-degree tracking
DFS: Recursion-based, finish time order

Legend:

Current Node
Zero In-Degree
In Order

Reference implementation of Topological Sort. Select a language tab to view and copy the code.

def topological_sort(adj: list[list[int]]) -> list[int]:
    n       = len(adj)
    visited = [False] * n
    order   = []

    def dfs(v: int) -> None:
        visited[v] = True
        for u in adj[v]:
            if not visited[u]:
                dfs(u)
        order.append(v)   # add AFTER all descendants

    for i in range(n):
        if not visited[i]:
            dfs(i)

    return order[::-1]   # reverse for topological order

Python — Code Walkthrough

  1. Nested dfs uses closure over order

    order.append(v) # add AFTER all descendants

    The nested dfs function closes over order from the enclosing scope. Appending v after recursing into all neighbors mirrors the C stack-push approach.

  2. Reverse at the end

    return order[::-1]

    DFS appends in reverse finish order. Reversing the list with the [::-1] slice gives the forward topological order. This is cleaner than maintaining a stack.

  3. Outer loop for disconnected graphs

    for i in range(n): if not visited[i]: dfs(i)

    Every unvisited vertex seeds a new DFS. This ensures disconnected components are all included in the final order.

  4. Recursion limit for large graphs

    def dfs(v: int) -> None: visited[v] = True ...

    Python's default recursion limit (1000) may be hit for large DAGs. For production use, consider an iterative DFS with an explicit stack, or call sys.setrecursionlimit.