diff --git a/dijkstrasAlgorithm.java b/dijkstrasAlgorithm.java new file mode 100644 index 0000000..4894fd2 --- /dev/null +++ b/dijkstrasAlgorithm.java @@ -0,0 +1,176 @@ +// Java Program to Implement Dijkstra's Algorithm +// Using Priority Queue + + +import java.util.*; + + +public class GFG { + + + private int dist[]; + private Set settled; + private PriorityQueue pq; + + private int V; + List > adj; + + // Constructor of this class + public GFG(int V) + { + + // This keyword refers to current object itself + this.V = V; + dist = new int[V]; + settled = new HashSet(); + pq = new PriorityQueue(V, new Node()); + } + + // Method 1 + // Dijkstra's Algorithm + public void dijkstra(List > adj, int src) + { + this.adj = adj; + + for (int i = 0; i < V; i++) + dist[i] = Integer.MAX_VALUE; + + // Add source node to the priority queue + pq.add(new Node(src, 0)); + + // Distance to the source is 0 + dist[src] = 0; + + while (settled.size() != V) { + + // Terminating ondition check when + // the priority queue is empty, return + if (pq.isEmpty()) + return; + + // Removing the minimum distance node + // from the priority queue + int u = pq.remove().node; + + // Adding the node whose distance is + // finalized + if (settled.contains(u)) + + // Continue keyword skips exwcution for + // following check + continue; + + // We don't have to call e_Neighbors(u) + // if u is already present in the settled set. + settled.add(u); + + e_Neighbours(u); + } + } + + // Method 2 + // To process all the neighbours + // of the passed node + private void e_Neighbours(int u) + { + + int edgeDistance = -1; + int newDistance = -1; + + // All the neighbors of v + for (int i = 0; i < adj.get(u).size(); i++) { + Node v = adj.get(u).get(i); + + // If current node hasn't already been processed + if (!settled.contains(v.node)) { + edgeDistance = v.cost; + newDistance = dist[u] + edgeDistance; + + // If new distance is cheaper in cost + if (newDistance < dist[v.node]) + dist[v.node] = newDistance; + + // Add the current node to the queue + pq.add(new Node(v.node, dist[v.node])); + } + } + } + + // Main driver method + public static void main(String arg[]) + { + + int V = 5; + int source = 0; + + // Adjacency list representation of the + // connected edges by declaring List class object + // Declaring object of type List + List > adj + = new ArrayList >(); + + // Initialize list for every node + for (int i = 0; i < V; i++) { + List item = new ArrayList(); + adj.add(item); + } + + // Inputs for the GFG(dpq) graph + adj.get(0).add(new Node(1, 9)); + adj.get(0).add(new Node(2, 6)); + adj.get(0).add(new Node(3, 5)); + adj.get(0).add(new Node(4, 3)); + + adj.get(2).add(new Node(1, 2)); + adj.get(2).add(new Node(3, 4)); + + // Calculating the single source shortest path + GFG dpq = new GFG(V); + dpq.dijkstra(adj, source); + + // Printing the shortest path to all the nodes + // from the source node + System.out.println("The shorted path from node :"); + + for (int i = 0; i < dpq.dist.length; i++) + System.out.println(source + " to " + i + " is " + + dpq.dist[i]); + } +} + +// Class 2 +// Helper class implementing Comparator interface +// Representing a node in the graph +class Node implements Comparator { + + // Member variables of this class + public int node; + public int cost; + + // Constructors of this class + + // Constructor 1 + public Node() {} + + // Constructor 2 + public Node(int node, int cost) + { + + // This keyword refers to current instance itself + this.node = node; + this.cost = cost; + } + + // Method 1 + @Override public int compare(Node node1, Node node2) + { + + if (node1.cost < node2.cost) + return -1; + + if (node1.cost > node2.cost) + return 1; + + return 0; + } +}