3.5.12 · HinglishGraphs

Floyd-Warshall — all-pairs shortest paths, O(V³)

1,834 words8 min readRead in English

3.5.12 · Coding › Graphs


WHAT hai problem?

Output ek poora distances ka matrix hota hai (aur optionally paths reconstruct karne ke liye ek aur matrix).


WHY ek naya algorithm (aur Dijkstra ko V baar run kyun nahi karte)?

  • Har source se Dijkstra run karo: — lekin negative edges ke saath kaam nahi karta.
  • Har source se Bellman-Ford run karo: , jo dense graphs () ke liye ho jaata hai.
  • Floyd-Warshall: ek clean , negative edges handle karta hai, aur sirf 5 lines ka code hai. Dense graphs aur chhote (maano ) ke liye yeh king hai.

HOW: scratch se derive karo (dynamic programming)

Ek subproblem ko carefully define karte hain — yahi iska dil hai.

Base case (): koi intermediate vertex allowed nahi, toh sirf single edges hi valid paths hain.

Transition — key insight. se tak ke shortest path ko consider karo jo intermediates use karta hai. Vertex ya toh is path mein use hota hai ya nahi:

  • USE nahi hota → path sirf use karta hai, toh uski length hai.
  • USE hota hai → kyunki koi negative cycle nahi hai, optimal path ko exactly ek baar visit karta hai. Isse par split karo: ek piece aur ek piece , dono sirf ko intermediates ke roop mein use karte hain. Toh uski length hai.

Hum dono mein se better lete hain:

2D array mein collapse karna (in-place trick)

Recurrence layer ko layer se update karta hai. Hum same matrix ko overwrite kar sakte hain. Kya yeh safe hai? Jab compute karte hain use karke:

  • nayi layer mein = . Kyunki hai (koi negative cycle nahi), yeh unchanged rehta hai.
  • Same ke liye bhi.

Toh overwriting un values ko corrupt nahi karta jo hum read karte hain. Isliye ek matrix kaafi hai.

def floyd_warshall(n, dist):       # dist[i][j] = weight or INF, dist[i][i]=0
    for k in range(n):             # k = intermediate vertex being "unlocked"
        for i in range(n):
            for j in range(n):
                if dist[i][k] + dist[k][j] < dist[i][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]
    return dist

Negative cycles detect karna

Run karne ke baad, diagonal check karo. Agar koi hai, toh ek negative cycle par hai (aapne se tak wapas jaane ka ek aisa path paaya jo rukne se bhi sasta hai).


Path reconstruction

Ek next[i][j] (ya parent[i][j]) matrix rakho. Har edge ke liye next[i][j] = j initialize karo. Jab bhi se relax karo, next[i][j] = next[i][k] set karo. rebuild karne ke liye: next follow karo jab tak nahi milta.


Figure — Floyd-Warshall — all-pairs shortest paths, O(V³)

Worked Example 1 — ek chhota 3-node graph

Vertices . Edges: , , . Koi aur nahi.

Initial matrix ( ko dikhaya hai):

from\to 0 1 2
0 0 4 11
1 · 0 2
2 · · 0

Unlock : koi path 0 se guzar ke improve hota hai? Koi bhi 0 mein point nahi karta, toh koi change nahi. Yeh step kyun? hai ke liye, toh bahut bada hai.

Unlock : vs check karo. update karo. Yeh step kyun? Ab route legal hai kyunki 1 unlock ho gaya hai.

Unlock : 2 ke koi outgoing edges nahi hain, koi improvement nahi.

Final . ✔


Worked Example 2 — negative edge (jahan Dijkstra fail hota hai)

Vertices . Edges: , , .

Initial: .

: vs update karo. Yeh step kyun? Negative edge 1 se guzarne wale detour ko sasta banata hai — Floyd-Warshall isse naturally handle karta hai kyunki min edge sign ki parwah nahi karta (jab tak koi negative cycle nahi hai).

Final . Dijkstra galati se commit kar deta.


Worked Example 3 — negative cycle detection

Edges: . Cycle total .

Run karne ke baad, relax hokar ho jaata hai. Diagonal negative ho jaata hai → negative cycle detect ho gaya. Yeh step kyun? Diagonal 0 se start hota hai; sirf ek negative loop back to isse 0 se neeche le ja sakta hai.


Recall Feynman: 12-saal ke bachche ko explain karo

Socho cities raston se judi hain jinke travel times hain. Aapko har pair of cities ke beech fastest time chahiye. Aap ek game khelte ho: "Agar mujhe ab raaste mein City A par rukne ki permission ho toh?" Aap har pair ko recheck karte ho: shayad A se jaana faster ho. Phir City B bhi unlock karo, sabko phir recheck karo. Phir City C... Jab aap saari cities unlock kar lete ho, tab har pair ke paas already uska fastest time hota hai. Bas itna hi — aapne sirf baar-baar poochha "kya is nayi city par rukne se madad milegi?" ek-ek city ke liye.


Active Recall

Floyd-Warshall mein DP state kya represent karta hai?
se tak ka shortest path sirf vertices ko intermediates use karte hue (endpoints hamesha allowed).
Floyd-Warshall recurrence kya hai?
.
Floyd-Warshall ki time aur space complexity kya hai?
time, space.
loop outermost kyun hona chahiye?
DP par recurse karta hai; saare pairs ko account karna finish karna hoga unlock karne se pehle, warna aap half-updated values read karte ho.
Floyd-Warshall se negative cycle kaise detect karte hain?
Run karne ke baad, agar koi hai toh ek negative cycle par hai.
Kya Floyd-Warshall negative edge weights handle kar sakta hai?
Haan, jab tak koi negative cycle nahi hai. (Dijkstra negative edges handle nahi kar sakta.)
In-place single-matrix update correct kyun hai?
aur read karna safe hai kyunki matlab woh entries iteration mein change nahi hoti.
Base case () matrix kya hota hai?
Diagonal par , edge weight agar edge exist karta hai, warna .
Floyd-Warshall mein paths kaise reconstruct karte hain?
next[i][j] rakho; edges ke liye se init karo; se relaxation par next[i][j]=next[i][k] set karo; rebuild ke liye next follow karo.
Dijkstra ko V baar run karne se Floyd-Warshall kab better hai?
Dense graphs, chhota , ya negative edges wale graphs mein; clean vs dense ke liye se behtar.

Connections

  • Dijkstra's Algorithm — single-source, sirf non-negative weights
  • Bellman-Ford — single-source, negatives handle karta hai, negative cycles detect karta hai
  • Dynamic Programming — Floyd-Warshall intermediate sets par layered DP hai
  • Johnson's Algorithmsparse graphs ke liye APSP, reweight karta hai phir Dijkstra run karta hai
  • Transitive Closure — same loop structure min ki jagah OR ke saath (Warshall's algorithm)
  • Negative Cycles — diagonal se detection

Concept Map

solved by

breaks on

slow O V^4 dense

handled by

based on

uses intermediates 1..k

starts from

recurrence

k not used

k used

valid because

answer at k=V

space saved by

APSP problem

Floyd-Warshall

Dijkstra x V

negative edges

Bellman-Ford x V

DP state d_k i,j

allow vertex set

base case k=0 edges only

min of skip k or split at k

d_k-1 i,j

d_k-1 i,k + d_k-1 k,j

no negative cycle

V x V distance matrix

in-place 2D overwrite