Topological Sort

Problem Statement

Return a topological ordering of a Directed Acyclic Graph (DAG).

Example: Graph with edges [[5,2],[5,0],[4,0],[4,1],[2,3],[3,1]] → [5,4,2,3,1,0]

Approach 1: DFS Post-order

Explanation: Perform DFS and add nodes to stack after exploring neighbors; reverse stack gives order.

Time Complexity: O(V + E)

Space Complexity: O(V) recursion stack

visited = set()
stack = []
function DFS(node):
    visited.add(node)
    for neighbor in node.neighbors:
        if neighbor not visited:
            DFS(neighbor)
    stack.push(node)
for node in all_nodes:
    if node not visited:
        DFS(node)
return reversed(stack)
          

Approach 2: Kahn’s Algorithm (BFS)

Explanation: Use in-degree array; push nodes with 0 in-degree into queue and update in-degrees.

Time Complexity: O(V + E)

Space Complexity: O(V)

in_degree = [0]*V
for u in all_nodes:
    for v in u.neighbors:
        in_degree[v] += 1
queue = nodes with in_degree 0
while queue not empty:
    node = queue.pop()
    result.append(node)
    for neighbor in node.neighbors:
        in_degree[neighbor] -= 1
        if in_degree[neighbor]==0:
            queue.push(neighbor)
return result