Topological sort — DFS-based, Kahn's algorithm (BFS-based)
3.5.7· Coding › Graphs
Topological sort HAI kya?
Cycle kyun ise tod deti hai? Agar hai, toh ko se pehle, ko se pehle, aur ko se pehle aana chahiye. Iska matlab ko se pehle aana padega — jo impossible hai. Isliye cycles ⇒ koi topological order nahi.
DO algorithms kyun hain?
Dono same problem solve karte hain lekin sochne ka tarika alag hai:
| DFS-based | Kahn's (BFS-based) | |
|---|---|---|
| Core idea | Ek node apne saare descendants ke baad finish hoti hai | Jo nodes ke koi prerequisites baaki nahi unhe baar baar hatao |
| Output banta hai | Reverse finish order mein | Arrival order mein |
| Cycle detection | Back edge (gray node) | $ |
| Data structure | Recursion stack | Queue + indegree array |
Dono mein chalte hain.
Algorithm 1 — DFS-based
Yeh kaise kaam karta hai (first principles se derivation)
Claim: Agar hum DFS ke vertices finish karne ka order reverse karein, toh har edge aage point karegi.
Koi bhi edge lo. Jab DFS pehli baar ko touch kare, ki state consider karo:
- unvisited: DFS, ko ke descendant ki tarah explore karega, isliye se pehle finish hoga. ✅ ( baad mein finish hoga ⇒ reversed order mein pehle)
- already finished: toh , ke start hone se pehle hi finish ho chuka tha. ✅
- in progress (gray, stack par): iska matlab ka path already hai, saath mein edge bhi = ek cycle. DAG mein allowed nahi. ❌ blocked.
Har valid (DAG) case mein, ke baad finish hota hai, toh reversed finish list mein , se pehle aata hai. Edge aage point karti hai. ∎
function topoDFS(G):
visited = {}, finished = []
for each vertex u in V:
if u not visited: dfs(u)
return reverse(finished)
function dfs(u):
mark u visited (GRAY)
for each edge u -> v:
if v GRAY: report CYCLE # back edge
if v not visited: dfs(v)
mark u BLACK
finished.append(u) # append on FINISH
Algorithm 2 — Kahn's Algorithm (BFS-based)
Yeh kaise kaam karta hai (derivation)
Define karo = mein point karne wali edges ki sankhya.
- Ek DAG mein hamesha kam se kam ek vertex hoti hai jiska indegree 0 ho (warna incoming edges ko backward follow karte raho ⇒ repeat ⇒ cycle). Toh hum hamesha start kar sakte hain.
- Ek 0-indegree vertex ko emit karke uski out-edges delete karne se baaki graph DAG hi rehta hai. Induction se poora graph khali ho jaata hai.
- Har edge aage point karti hai: jab hum emit karte hain, ke saare prerequisites already emit ho chuke hain; edge , ko decrement karti hai, toh strictly baad mein emit hota hai. ✅
function kahn(G):
compute indeg[v] for all v
Q = queue of all v with indeg[v] == 0
order = []
while Q not empty:
u = Q.pop()
order.append(u)
for each edge u -> v:
indeg[v] -= 1
if indeg[v] == 0: Q.push(v)
if len(order) < |V|: report CYCLE # leftover nodes stuck in a cycle
return order

Worked Example (same graph, dono methods)
Graph edges:
5→0, 5→2, 4→0, 4→1, 2→3, 3→1
Vertices: 0 1 2 3 4 5
Kahn's walk-through
Indegrees: 0:2, 1:2, 2:1, 3:1, 4:0, 5:0
| Step | Queue (indeg 0) | Pop | Emit | Updates |
|---|---|---|---|---|
| 1 | [4, 5] | 4 | 4 | 0→1, 1→1 |
| 2 | [5] | 5 | 5 | 0→0✅, 2→0✅ |
| 3 | [0, 2] | 0 | 0 | — |
| 4 | [2] | 2 | 2 | 3→0✅ |
| 5 | [3] | 3 | 3 | 1→0✅ |
| 6 | [1] | 1 | 1 | — |
Order: 4 5 0 2 3 1 — Yeh step kyun? Humne hamesha indegree-0 node pull kiya, jo guarantee karta hai ki har prerequisite pehle hi bahar aa chuka tha. 6 emit = |V| ⇒ valid DAG.
DFS walk-through (5 se start, phir 4)
- dfs(5)→dfs(0) finish 0 →dfs(2)→dfs(3)→dfs(1) finish 1, finish 3, finish 2, finish 5
- dfs(4): 0,1 done → finish 4
- finished list =
[0,1,3,2,5,4] - Reverse = 4 5 2 3 1 0
Yeh step kyun? Hum har node ko tabhi append karte hain jab uske descendants finish ho jaayein, isliye reverse karne par roots pehle aa jaate hain. (Note: Kahn se alag valid order — dono correct hain!)
Common Mistakes
Active Recall
Recall Quick self-test (answers cover kar lo)
- Topological order kab exist karta hai? → iff graph ek DAG ho.
- DFS-topo mein node kab record hoti hai? → finish hone par, phir reverse karo.
- Kahn's ka starting set kya hai? → saare vertices jinki indegree 0 ho.
- Dono algorithms ki complexity? → .
- Har ek cycle kaise detect karta hai? → DFS: gray node ki taraf back edge. Kahn: emitted count .
Recall Feynman: ek 12-saal ke bacche ko explain karo
Socho tumhare paas homework tasks hain jahan kuch tasks doosron se pehle karni zaroori hain — essay likhne se pehle kitaab padhe bina nahi ho sakta. Topological sort saari tasks ko iss tarah line mein lagata hai ki tum koi baad wali task kabhi pehle wali se pehle na karo. Tarika 1 (DFS): ek task mein ghuso aur us se related saari tasks mein pehle ghuso; jis moment ek task poori tarah finish ho, use ek "done" pile mein daalo. Pile ulti hogi, toh palat do. Tarika 2 (Kahn): koi bhi task karo jiske koi requirements baaki nahi hain; jab bhi koi finish karo, uske followers ki list se use cross out karo — kuch followers ke ab zero requirements ho jaayenge aur woh doable ban jaayenge. Agar tasks baaki hote hue tum ruk jao, toh woh ek doosre par depend karte hain aur unhe order nahi kiya ja sakta.
Connections
- Depth-First Search (DFS) — DFS-topo bas DFS + finish-time ordering hai.
- Breadth-First Search (BFS) — Kahn's, indegree se driven BFS hai.
- Directed Acyclic Graph (DAG) — kisi bhi topo order ke liye precondition.
- Cycle Detection in Directed Graphs — dono algorithms cycles ko byproduct ke taur par detect karte hain.
- Course Schedule Problem — topological sort ka classic application.
- Shortest Path in DAG) — shortest paths ke liye topological order mein edges relax karo.
- Strongly Connected Components — Kosaraju bhi isi tarah DFS finish ordering use karta hai.