Hum ek array dist[] rakhte hain jahan dist[v] hamare abhi tak ka best known distance hai. Yeh sab ke liye ∞ se shuru hota hai, sivaay dist[s]=0 ke, aur jab hum shorter routes discover karte hain to hum ise chota karte hain (relaxation).
Claim (wo invariant jo hume prove karna hai): Jab hum frontier se smallest tentative distance wale vertex u ko pop karte hain, tab dist[u] pehle se hi true shortest distance hai.
dijkstra(G, s):
dist[v] = INF for all v; dist[s] = 0
PQ = min-heap with (0, s)
while PQ not empty:
(d, u) = PQ.pop_min()
if d > dist[u]: continue # stale entry, skip
for each edge (u, v, w):
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
PQ.push((dist[v], v)) # lazy: leaves old entry behind
return dist
Graph (directed):
A→B(4), A→C(1), C→B(2), C→D(5), B→D(1), source A.
Step
Pop
dist updates
dist after
init
—
A=0
A0 B∞ C∞ D∞
1
A(0)
C: 0+1=1, B: 0+4=4
A0 B4 C1 D∞
2
C(1)
B: 1+2=3<4 ✓, D: 1+5=6
A0 B3 C1 D6
3
B(3)
D: 3+1=4<6 ✓
A0 B3 C1 D4
4
D(4)
none
done
C ko B se pehle kyun pop kiya? Step 1 ke baad, heap mein B(4) aur C(1) hain. Hum minimum, C ko pop karte hain. Yeh greedy order hi correctness guarantee karta hai — aur yahi wajah hai ki C ki relaxation baad mein B ko 4 se 3 pe improve karti hai.
Recall Feynman: ek 12-saal ke bachche ko explain karo
Tum ghar pe ho aur town ke har ghar tak pahunchne ka sabse fast time jaanna chahte ho. Tum ek timer shuru karte ho. Roads alag-alag minutes lagte hain chalne ke liye. Har ghar pe tumhara ek "abhi tak ka best time" wala sticky note hai. Tum hamesha us nearest ghar ko jaate ho jise tune abhi finalize nahi kiya, kyunki ek baar jab tum wahaan fast way se pahunch gaye, koi slower ghar tumhe shortcut nahi de sakta (sab roads positive time lete hain — koi magic road nahi hai jo minutes wapas de). Tum use "done" stamp karte ho aur uske neighbors ke sticky notes update karte ho. Repeat. Priority queue bas ek smart tarika hai jisse hamesha nearest not-done ghar quickly milta hai.
Source s se ek graph mein saare vertices tak single-source shortest paths, jahan non-negative edge weights hon.
"Relaxation" kya hai?
dist[v]=min(dist[v],dist[u]+w(u,v)) update karna jab u ke through jaana sasta ho.
Dijkstra ko non-negative edges kyun chahiye?
Correctness proof use karta hai "baaki path ka weight ≥ 0 hai" takki popped min-distance vertex already final ho; negative edges ise tod dete hain kyunki ek longer path sasta ho sakta hai.
Ek vertex ka distance kab finalized hota hai?
Jab use priority queue se popped kiya jaata hai non-stale distance ke saath (push/relax hone pe nahi).
Binary heap ke saath time complexity kya hai?
O((V+E)logV).
Fibonacci heap kaun si complexity deta hai?
O(E+VlogV) amortized O(1) decrease-key ke zariye.
if d > dist[u]: continue line kya karti hai?
Lazy-deletion approach mein stale heap entries skip karti hai (ek vertex multiple baar push hota hai; sirf uska pehla/best pop matter karta hai).
Negative edges ke liye kaun sa algorithm use karein?
Bellman-Ford, O(VE) (ya all-pairs ke liye Johnson's).
Unweighted shortest path ke liye kaun sa algorithm?
BFS, O(V+E) — koi heap ki zaroorat nahi.
Greedy invariant proof mein y kya hai?
u tak true shortest path pe pehla unfinalized vertex; jo finalized predecessor x ke zariye already relax ho chuka hai.