From 9311783d7cd8ddc8426eb1578765f7908bd8e29b Mon Sep 17 00:00:00 2001 From: Akash2005sharma Date: Tue, 14 Oct 2025 18:59:10 +0530 Subject: [PATCH] bellman-ford --- src/algorithms/graph/bellmanFord.js | 34 ++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/algorithms/graph/bellmanFord.js b/src/algorithms/graph/bellmanFord.js index e89e302..fac0e5b 100644 --- a/src/algorithms/graph/bellmanFord.js +++ b/src/algorithms/graph/bellmanFord.js @@ -7,31 +7,49 @@ export default function runBellmanFord(nodes, edges, source) { // Relax edges |V|-1 times for (let i = 0; i < nodes.length - 1; i++) { + let updated = false; for (const edge of edges) { - const { from, to, weight } = edge; + const from = edge.u ?? edge.from; + const to = edge.v ?? edge.to; + const weight = edge.w ?? edge.weight; + const step = { type: "relax", iteration: i + 1, - edge, - prevDistance: dist[to] + edge: { u: from, v: to, w: weight }, + prevDistance: dist[to], }; - if (dist[from] + weight < dist[to]) { + // ✅ Important: Check dist[from] !== Infinity before relaxing + if (dist[from] !== Infinity && dist[from] + weight < dist[to]) { dist[to] = dist[from] + weight; step.updatedDistance = dist[to]; + updated = true; + } else { + step.type = "skip"; } steps.push(step); } + + // Optimization: if no update in this pass, break early + if (!updated) break; } // Check for negative weight cycles for (const edge of edges) { - const { from, to, weight } = edge; - if (dist[from] + weight < dist[to]) { - steps.push({ type: "negativeCycle", edge }); + const from = edge.u ?? edge.from; + const to = edge.v ?? edge.to; + const weight = edge.w ?? edge.weight; + + if (dist[from] !== Infinity && dist[from] + weight < dist[to]) { + steps.push({ type: "negative-cycle", edge: { u: from, v: to, w: weight } }); } } - return steps; + // Push final state step for visualization + steps.push({ type: "done", distances: { ...dist } }); + + // Return both steps & final distances + return { steps, distances: dist }; }