Dijkstra’s Algorithm Implementation in Java

 

 

This Java program demonstrates the implementation of Dijkstra’s algorithm to find the shortest paths from a single source vertex to all other vertices in a graph with non-negative weights. The algorithm uses a priority queue to continually select the vertex with the shortest known distance from the source.

Java Code

import java.util.*;

class Graph {
    private int V; // Number of vertices
    private List<List<Node>> adjList;

    public Graph(int V) {
        this.V = V;
        adjList = new ArrayList<>();
        for (int i = 0; i < V; i++) {
            adjList.add(new ArrayList<>());
        }
    }

    public void addEdge(int src, int dest, int weight) {
        adjList.get(src).add(new Node(dest, weight));
    }

    public void dijkstra(int src) {
        PriorityQueue<Node> pq = new PriorityQueue<>(V, new Node());
        int[] dist = new int[V];

        Arrays.fill(dist, Integer.MAX_VALUE);
        pq.add(new Node(src, 0));
        dist[src] = 0;

        while (!pq.isEmpty()) {
            Node node = pq.poll();
            int u = node.vertex;

            for (Node adjacent : adjList.get(u)) {
                int v = adjacent.vertex;
                int weight = adjacent.weight;
                if (dist[u] + weight < dist[v]) {
                    dist[v] = dist[u] + weight;
                    pq.add(new Node(v, dist[v]));
                }
            }
        }

        printSolution(dist, src);
    }

    private void printSolution(int[] dist, int src) {
        System.out.println("Vertex Distance from Source " + src);
        for (int i = 0; i < V; i++) {
            System.out.println(i + " \t\t " + dist[i]);
        }
    }

    class Node implements Comparator<Node> {
        public int vertex, weight;

        public Node() {
        }

        public Node(int vertex, int weight) {
            this.vertex = vertex;
            this.weight = weight;
        }

        @Override
        public int compare(Node node1, Node node2) {
            if (node1.weight > node2.weight)
                return 1;
            if (node1.weight < node2.weight)
                return -1;
            return 0;
        }
    }
}

public class DijkstrasAlgorithm {
    public static void main(String[] args) {
        int V = 5;
        Graph g = new Graph(V);
        g.addEdge(0, 1, 9);
        g.addEdge(0, 2, 6);
        g.addEdge(0, 3, 5);
        g.addEdge(0, 4, 3);
        g.addEdge(2, 1, 2);
        g.addEdge(2, 3, 4);

        g.dijkstra(0);
    }
}

Explanation of the Code

The program defines a Graph class which includes:

  • Graph Structure: Represents the graph using an adjacency list where each node is represented as a pair (vertex, weight).
  • addEdge: Method to add an edge between two vertices with a given weight.
  • dijkstra: Implements Dijkstra’s algorithm using a priority queue. It keeps track of the minimum distance from the source to each vertex and updates distances based on the currently processed vertex’s adjacent nodes.
  • Node Class: Used for the priority queue to store the vertex and its current shortest distance. It includes a comparator to order nodes by their weights.
  • printSolution: Outputs the shortest distance from the source to each vertex.

This setup ensures that the shortest path distances are efficiently computed and easy to retrieve, making Dijkstra’s algorithm a powerful tool for graph analysis in many applications such as network routing protocols.

 

Leave a Reply

Your email address will not be published. Required fields are marked *