Finish times ke baare mein key fact. Maano SCCs A aur B hain, condensation mein edge A→B hai (toh A DAG mein B se "pehle" aata hai). Tab:
maxu∈Af(u)>maxv∈Bf(v)
yaani woh SCC jo DAG mein "pehle" hai, woh baad mein finish hoti hai.
Proof sketch (Yeh sach kyun hai):
Case 1: DFS pehle A mein enter karta hai. Kyunki A, B ko reach kar sakta hai, DFS A aur B dono ko explore karega wapas aane se pehle, toh A mein pehle touch kiya gaya node B ki saari cheez ke baad finish hoga. ✓
Case 2: DFS pehle B mein enter karta hai. Kyunki condensation ek DAG hai aur edge A→B jaati hai, B→A ka koi path nahi hai. Toh B ki DFS poori tarah finish ho jaati hai A ko touch kiye bina. Baad mein DFS A mein start hoti hai → A, B ke baad finish hota hai. ✓
Ab graph reverse karo.Grev mein, edge B→A ban jaati hai. Doosri DFS hum highest finish time wale vertex se shuru karte hain — woh vertex original DAG ki "source" SCC mein hota hai (koi SCC baad mein finish nahi hoti). Grev mein woh SCC ek sink hai: doosri SCCs se uske edges reverse ho gaye hain aur ab us mein point karte hain, toh DFS doosri SCC mein escape nahi kar sakti. Isliye ek DFS tree = exactly ek SCC. Use hatao, repeat karo. ∎
Hum current DFS path/SCC-candidates ki nodes ek explicit stack par rakhte hain, ek onStack[] flag ke saath.
low[u] kehta hai "sabse pehle discover hua node jo u loop back kar sakta hai current SCC se bahar gaye bina."
Agar u kisi pehle wale node tak pahunch sakta hai (low[u]<disc[u]), toh u apni SCC ka entry point nahi hai — koi ancestor hai.
Agar u khud se upar nahi ja sakta (low[u]==disc[u]), toh u apni SCC ka highest node hai = uski root. Stack ko u tak pop karo; woh vertices ek SCC hain.
Recall Feynman: ek 12-saal ke bachche ko samjhao
Socho cities one-way roads se connected hain. Ek "club" un cities ka group hai jahan aap kisi bhi city se kisi bhi doosri city tak drive kar sako aur wapas aa sako — round trip hamesha possible ho. Woh club ek SCC hai. Kosaraju har city ko do baar explore karta hai: pehle log jis order mein apna tour finish karte hain woh note karne ke liye, phir woh saari road directions ulti kar deta hai aur jo sabse aakhir mein finish hua usse shuru karke re-tour karta hai — har naya tour exactly ek club fence kar deta hai. Tarjan woh smart traveler hai jo ek hi baar mein karta hai: woh "cities jahan mujhe abhi bhi wapas loop karna pad sakta hai" ka ek stack rakhta hai, aur jis moment use pata chalta hai ki ek city khud se purani kisi tak nahi pahunch sakti, woh jaanta hai ki woh city ek club ki leader hai aur stack se use aur upar waalon ko le leta hai.
Vertices ka ek maximal set jahan har pair mutually reachable ho (dono directions mein paths).
Graph ki condensation kya hoti hai?
Har SCC ko ek node mein contract karo; result hamesha ek DAG hota hai.
Kosaraju ke teen steps?
(1) G par DFS karo finish times record karte hue; (2) graph reverse karo; (3) reversed graph par decreasing finish-time order mein DFS karo — har tree ek SCC hai.
Kosaraju mein highest-finish-time vertex kyun matter karta hai?
Woh original DAG ki source SCC mein hota hai = reversed graph mein sink SCC, toh uski DFS tree doosri SCCs mein leak nahi kar sakti.
Tarjan mein low[u] ka matlab kya hai?
Sabse chhota discovery index jo u se tree edges plus at most ek aisi node tak edge ke zariye reachable hai jo abhi bhi stack par ho.
Tarjan mein SCC root ki condition?
low[u] == disc[u]; stack ko u tak aur u sameyt pop karo SCC banane ke liye.
Tarjan: low[v] vs disc[v] kab use karo?
Tree edges ke liye low[v] (recursive child); back/cross edges ke liye disc[v] sirf jab onStack[v] ho.
Dono algorithms ki time complexity?
O(V+E).
Tarjan mein onStack[] kyun zaroori hai?
Already-finished SCCs mein jaane wali edges ko ignore karne ke liye, taaki alag components merge na ho jaayein.
SCC aur undirected connected component mein farq?
SCC ko mutual (dono taraf) reachability chahiye; undirected components ko sirf ek single path chahiye.