Finding the shortest path between nodes is one of the most important graph problems. It powers navigation systems, network routing, dependency analysis, AI pathfinding (A*), and more.
This blog will cover core shortest path algorithms, categorized by graph type.
π§© Types of Shortest Path Problems
- Unweighted Graphs β BFS gives shortest path.
 - Weighted Graphs (no negative weights) β Dijkstraβs algorithm.
 - Graphs with negative weights (but no negative cycles) β Bellman-Ford.
 - All-Pairs Shortest Path β Floyd-Warshall (or repeated Dijkstra).
 - Heuristic Shortest Path β A* Search.
 
1οΈβ£ BFS β Shortest Path in Unweighted Graphs
π Works because every edge has equal weight (1).
- Time Complexity: O(V + E)
 - Space: O(V)
 
Java Snippet:
import java.util.*;
public class BFSShortestPath {
    public static int shortestPath(int n, List<List<Integer>> graph, int src, int dest) {
        boolean[] visited = new boolean[n];
        int[] dist = new int[n];
        Arrays.fill(dist, -1);
        Queue<Integer> q = new LinkedList<>();
        q.add(src);
        dist[src] = 0;
        visited[src] = true;
        while (!q.isEmpty()) {
            int node = q.poll();
            if (node == dest) return dist[node];
            for (int nei : graph.get(node)) {
                if (!visited[nei]) {
                    visited[nei] = true;
                    dist[nei] = dist[node] + 1;
                    q.add(nei);
                }
            }
        }
        return -1; // no path
    }
    public static void main(String[] args) {
        int n = 6;
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i < n; i++) graph.add(new ArrayList<>());
        graph.get(0).add(1);
        graph.get(0).add(2);
        graph.get(1).add(3);
        graph.get(2).add(3);
        graph.get(3).add(4);
        graph.get(4).add(5);
        System.out.println("Shortest Path: " + shortestPath(n, graph, 0, 5));
    }
}
β
 Output: Shortest Path: 4
2οΈβ£ Dijkstraβs Algorithm β Weighted Graphs (No Negatives)
π Uses a priority queue (min-heap) to always expand the shortest tentative distance first.
- Time Complexity: O((V + E) log V) with PQ
 - Handles large weighted graphs efficiently.
 
Java Snippet:
import java.util.*;
public class Dijkstra {
    static class Pair {
        int node, dist;
        Pair(int n, int d) { node = n; dist = d; }
    }
    public static int[] dijkstra(int n, List<List<Pair>> graph, int src) {
        int[] dist = new int[n];
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[src] = 0;
        PriorityQueue<Pair> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a.dist));
        pq.add(new Pair(src, 0));
        while (!pq.isEmpty()) {
            Pair curr = pq.poll();
            if (curr.dist > dist[curr.node]) continue;
            for (Pair nei : graph.get(curr.node)) {
                int newDist = dist[curr.node] + nei.dist;
                if (newDist < dist[nei.node]) {
                    dist[nei.node] = newDist;
                    pq.add(new Pair(nei.node, newDist));
                }
            }
        }
        return dist;
    }
    public static void main(String[] args) {
        int n = 5;
        List<List<Pair>> graph = new ArrayList<>();
        for (int i = 0; i < n; i++) graph.add(new ArrayList<>());
        graph.get(0).add(new Pair(1, 2));
        graph.get(0).add(new Pair(2, 4));
        graph.get(1).add(new Pair(2, 1));
        graph.get(1).add(new Pair(3, 7));
        graph.get(2).add(new Pair(4, 3));
        graph.get(3).add(new Pair(4, 1));
        int[] dist = dijkstra(n, graph, 0);
        System.out.println("Distances: " + Arrays.toString(dist));
    }
}
β
 Output Example:
Distances: [0, 2, 3, 9, 6]
3οΈβ£ Bellman-Ford β Handles Negative Weights
π Relaxes all edges V-1 times.
- Detects negative weight cycles.
 - Time Complexity: O(V * E)
 
Java Snippet:
import java.util.*;
public class BellmanFord {
    static class Edge {
        int u, v, w;
        Edge(int u, int v, int w) { this.u = u; this.v = v; this.w = w; }
    }
    public static int[] bellmanFord(int n, List<Edge> edges, int src) {
        int[] dist = new int[n];
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[src] = 0;
        for (int i = 0; i < n - 1; i++) {
            for (Edge e : edges) {
                if (dist[e.u] != Integer.MAX_VALUE && dist[e.u] + e.w < dist[e.v]) {
                    dist[e.v] = dist[e.u] + e.w;
                }
            }
        }
        // Check negative cycle
        for (Edge e : edges) {
            if (dist[e.u] != Integer.MAX_VALUE && dist[e.u] + e.w < dist[e.v]) {
                throw new RuntimeException("Negative Weight Cycle Detected!");
            }
        }
        return dist;
    }
    public static void main(String[] args) {
        int n = 5;
        List<Edge> edges = Arrays.asList(
            new Edge(0, 1, -1),
            new Edge(0, 2, 4),
            new Edge(1, 2, 3),
            new Edge(1, 3, 2),
            new Edge(1, 4, 2),
            new Edge(3, 2, 5),
            new Edge(3, 1, 1),
            new Edge(4, 3, -3)
        );
        System.out.println("Distances: " + Arrays.toString(bellmanFord(n, edges, 0)));
    }
}
β
 Output Example:
Distances: [0, -1, 2, -2, 1]
4οΈβ£ Floyd-Warshall β All-Pairs Shortest Path
π Dynamic Programming on adjacency matrix.
- Time Complexity: O(VΒ³)
 - Works with negatives (no cycles).
 
Pseudo Steps:
for k in 1..V
  for i in 1..V
    for j in 1..V
      dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
β Best when graph is dense and we need all-pairs shortest paths.
5οΈβ£ A* Algorithm β Heuristic Shortest Path
π Used in AI (pathfinding in games, maps).
- 
Uses f(n) = g(n) + h(n)
- 
g(n)β cost so far - 
h(n)β heuristic (like Euclidean/Manhattan distance) 
 - 
 
β More efficient than Dijkstra when heuristic is good.
π― Problem Applications
- Network Routing (OSPF uses Dijkstra, RIP uses Bellman-Ford)
 - Google Maps shortest route β Dijkstra + A*.
 - Game AI Pathfinding β A*.
 - Course Prerequisite Scheduling β Topological + Shortest Path in DAG.
 
β‘ Key Takeaways
- Unweighted Graph β BFS
 - Positive Weights β Dijkstra
 - Negative Weights β Bellman-Ford
 - All-Pairs β Floyd-Warshall
 - Heuristic Pathfinding β A*
 
    
Top comments (0)