Bellman Ford
Introduction:
This is a single source shortest path Algorithm where there is a single source from which we want to find shortest path to a node or to all other nodes. Negative edges are allowed in the graph.This method is also used in negative weighted cycle detection in graphs.
Problem Statement:
find the shortest paths to all nodes from a start node.
Algorithm
1. A graph \(G(V, E)\) and start vertex \(s\) are given.
2. we have two arrays \(dist[\ ]\) initialized to \(\infty\) and \(prev[\ ]\) initilaized to -1 for all vertices
3. Relax all egdes ie., \(dist[v]\) .
4. Repeat above step \(|V|-1 \) times
5. Finally check step 3 again to see if there is any relaxation then there is a negative weighted cycle in the graph or else we get our shortest paths to all vertices from \(prev[\ ]\) and \(dist[\ ]\)
Pseudo code :
BellmanFord( G, s ): dist[G.num_vertices] := INFINITY prev[G.num_vertices] := -1 dist[s] := 0 repeat G.num_vertices - 1 times: repeat G.num_edges times: if dist[u] + w < dist[v] prev[v] = u
Code :
// single source shortest path negative edges allowed #include <bits/stdc++.h> using namespace std; #define adjacency_list map<int, vector<pair<int, int>>> #define mp make_pair #define INF INT_MAX typedef struct edge { int u; int v; int w; } Edge; typedef struct graph { adjacency_list adj; int num_edges; int num_vertices; Edge *edge; } graph; void bellmanford(graph G, int source) { vector<int> dist(G.num_vertices, INF); vector<int> prev(G.num_vertices, -1); dist[source] = 0; for (int i = 0; i < G.num_vertices - 1; i++) { for (int j = 0; j < G.num_edges; j++) { int u = G.edge[j].u; int v = G.edge[j].v; int w = G.edge[j].w; if (dist[u] != INF && dist[u] + w < dist[v]) { dist[v] = dist[u] + w; prev[v] = u; } } } cout << "vertex prev dist\n"; for (int i = 0; i < G.num_vertices; i++) { cout << i << " " << prev[i] << " " << dist[i] << "\n"; } // cout << "\n"; } int main() { // undirected graph graph G; // u - {{v1,w1}, {v2, w2}, .... {vk,wk}} cin >> G.num_vertices; cin >> G.num_edges; G.edge = new Edge[G.num_edges]; int u, v, w; for (int i = 0; i < G.num_edges; i++) { cin >> G.edge[i].u >> G.edge[i].v >> G.edge[i].w; } int s; cout << "Enter start vertext for bellmanford : "; cin >> s; bellmanford(G, s); // cout << "\n"; }
Complexity Analysis :
Time Complexity : \(O(|V|.|E|)\)