Topological Sort
Use when: Ordering tasks with dependencies, detecting cycles in directed graphs.
Complexity: O(V + E)
Kahn’s Algorithm (BFS-based)
from collections import deque
def topo_sort(n, prerequisites):
graph = [[] for _ in range(n)]
indegree = [0] * n
for a, b in prerequisites:
graph[b].append(a) # b -> a (b must come before a)
indegree[a] += 1
queue = deque([i for i in range(n) if indegree[i] == 0])
order = []
while queue:
node = queue.popleft()
order.append(node)
for neighbor in graph[node]:
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
queue.append(neighbor)
return order if len(order) == n else [] # empty = cycle detectedDFS-based
def topo_sort_dfs(n, graph):
WHITE, GRAY, BLACK = 0, 1, 2
color = [WHITE] * n
result = []
has_cycle = [False]
def dfs(u):
if has_cycle[0]:
return
color[u] = GRAY
for v in graph[u]:
if color[v] == GRAY:
has_cycle[0] = True
return
if color[v] == WHITE:
dfs(v)
color[u] = BLACK
result.append(u)
for i in range(n):
if color[i] == WHITE:
dfs(i)
if has_cycle[0]:
return []
return result[::-1]Signals in a Problem
- “Course schedule” / “task ordering”
- Dependencies between items
- Detect cycle in directed graph
- “Can all tasks be completed?”