Order DAG vertices so edges go forward; detect cycles via DFS or Kahn's algorithm
Use indegrees (Kahn) or DFS finishing times to produce a linear order for DAGs.
Use when dependencies exist and tasks must be ordered before execution.
Process zero-indegree queue
from collections import deque
def topo_kahn(n, edges):
adj=[[] for _ in range(n)]; indeg=[0]*n
for u,v in edges: adj[u].append(v); indeg[v]+=1
q=deque([i for i in range(n) if indeg[i]==0]); order=[]
while q:
u=q.popleft(); order.append(u)
for v in adj[u]:
indeg[v]-=1
if indeg[v]==0: q.append(v)
return order if len(order)==n else []
Postorder push to stack
def topo_dfs(n, edges):
adj=[[] for _ in range(n)];
for u,v in edges: adj[u].append(v)
vis=[0]*n; order=[]; ok=True
def dfs(u):
nonlocal ok
vis[u]=1
for v in adj[u]:
if vis[v]==0: dfs(v)
elif vis[v]==1: ok=False
vis[u]=2; order.append(u)
for i in range(n):
if vis[i]==0: dfs(i)
return order[::-1] if ok else []
Detect back edges/remaining indegrees
def has_cycle_kahn(n, edges):
return len(topo_kahn(n, edges)) == 0
def template(*args, **kwargs):
# General template placeholder
pass
Each edge/vertex processed once.
Graph + indegree arrays.