What if some roads actually pay you to travel them? How do you find the cheapest path then?
Why Bellman Ford Algorithm Negative Weights in DSA C?
Imagine you are planning a road trip and want to find the shortest path between cities. Some roads have tolls (positive costs), but others offer discounts (negative costs). Trying to calculate the cheapest route by hand, especially with discounts, is confusing and error-prone.
Manually checking every possible path to find the cheapest route is slow and easy to mess up. Negative costs make it even harder because simple methods can get stuck or give wrong answers, missing cheaper routes that use discounts.
The Bellman Ford algorithm smartly handles roads with discounts (negative weights). It systematically updates the shortest paths, even if some roads reduce the total cost. It also detects if there is a loop that keeps reducing cost endlessly, which means no solution.
int distances[numCities]; // Manually try all paths and update distances for (int i = 0; i < numPaths; i++) { // Complex checks and updates }
for (int i = 0; i < numCities - 1; i++) { for (int j = 0; j < numEdges; j++) { // Relax edges to update shortest paths } }
You can reliably find shortest paths in graphs even when some edges reduce total cost, and detect impossible cases.
Finding the cheapest flight route where some flights offer cashback or discounts, so the total travel cost can be less than expected.
Manual path checking is slow and error-prone with negative weights.
Bellman Ford updates shortest paths step-by-step, handling negative edges.
It detects negative cycles where no shortest path exists.
Practice
Bellman-Ford algorithm compared to Dijkstra's algorithm?Solution
Step 1: Understand the limitation of Dijkstra's algorithm
Dijkstra's algorithm cannot correctly handle graphs with negative weight edges because it assumes that once a node's shortest path is found, it cannot be improved.Step 2: Recognize Bellman-Ford's capability
Bellman-Ford algorithm can handle negative weight edges and detect negative weight cycles, making it more versatile.Final Answer:
It can handle graphs with negative weight edges. -> Option DQuick Check:
Negative weights handled = A [OK]
- Thinking Bellman-Ford is always faster
- Assuming it uses less memory
- Believing it only works on acyclic graphs
Solution
Step 1: Understand distance initialization
Distances to all vertices except the source should be set to a very large number (infinity), here represented by INT_MAX, to indicate they are initially unreachable.Step 2: Set source distance to zero
The distance to the source vertex itself must be zero because the shortest path from source to source is zero.Final Answer:
int dist[V]; for(int i=0; i -> Option BQuick Check:
Initialize all to max, source to 0 = C [OK]
- Initializing all distances to zero
- Using -1 for unreachable distances
- Setting all distances to source index
edges = [(0,1,4), (0,2,5), (1,2,-3), (2,3,4)] starting from source 0?Solution
Step 1: Initialize distances
dist = [0, INF, INF, INF]Step 2: Relax edges repeatedly
First iteration:
dist[1] = min(INF, 0+4) = 4
dist[2] = min(INF, 0+5) = 5
dist[2] = min(5, 4 + (-3)) = 1
dist[3] = min(INF, 1 + 4) = 5
Second iteration:
dist[1] stays 4
dist[2] stays 1
dist[3] stays 5
No further updates.Final distances:
[0, 4, 1, 5]Final Answer:
[0, 4, 1, 5] -> Option AQuick Check:
Relax edges to update distances = A [OK]
- Not relaxing edges enough times
- Ignoring negative edge effect
- Wrong initial distances
for (int i = 0; i < V; i++) {
for (int j = 0; j < E; j++) {
int u = edges[j].src;
int v = edges[j].dest;
int w = edges[j].weight;
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
}
}
}Solution
Step 1: Check loop iteration count
Bellman-Ford requires relaxing edges exactly V-1 times to find shortest paths correctly.Step 2: Identify the incorrect loop count
The outer loop runs V times here, which is one extra iteration and unnecessary.Final Answer:
The outer loop should run V-1 times, not V times. -> Option AQuick Check:
Outer loop runs V-1 times = D [OK]
- Running outer loop V times instead of V-1
- Confusing inner loop count with vertex count
- Incorrect weight comparison direction
[(0,1,1), (1,2,-1), (2,3,-1), (3,1,-1)], what will Bellman-Ford detect when run from source 0?Solution
Step 1: Analyze the cycle in the graph
The edges (1->2), (2->3), and (3->1) form a cycle with total weight -1 + -1 + -1 = -3, which is negative.Step 2: Understand Bellman-Ford's negative cycle detection
Bellman-Ford detects negative weight cycles by checking for further relaxation after V-1 iterations. Here, it will detect the negative cycle.Final Answer:
It will detect a negative weight cycle. -> Option CQuick Check:
Negative cycle detected = A [OK]
- Assuming algorithm runs infinitely
- Believing it finds shortest paths despite negative cycle
- Ignoring cycle detection step
Ready to prove it?
Pass the test and this pattern moves unknown
