1. class iPair
  2. {
  3. int vertex;
  4. int weight;
  5. iPair(int vertex, int weight)
  6. {
  7. this.vertex = vertex;
  8. this.weight = weight;
  9. }
  10. }
  11.  
  12. class Pair
  13. {
  14. int node;
  15. int dist;
  16. Pair(int node, int dist)
  17. {
  18. this.node = node;
  19. this.dist = dist;
  20. }
  21. }
  22. class Solution {
  23. public int[] dijkstra(int V, int[][] edges, int src) {
  24.  
  25. // Step-1 Create an adjacency list
  26. ArrayList<ArrayList<iPair>> adj = new ArrayList<>();
  27. for(int i=0; i<V; i++)
  28. {
  29. adj.add(new ArrayList<iPair>());
  30. }
  31. for(int[] edge : edges)
  32. {
  33. int u = edge[0];
  34. int v = edge[1];
  35. int w = edge[2];
  36.  
  37. adj.get(u).add(new iPair(v, w));
  38. adj.get(v).add(new iPair(u, w));
  39. }
  40.  
  41. // Step-2 Create a distance array
  42. int[] distance = new int[V];
  43. Arrays.fill(distance, (int)1e8);
  44. distance[src] = 0;
  45.  
  46. // Step-3 Create a min-heap <dist, node> to store shortest distance first
  47. PriorityQueue<Pair> pq = new PriorityQueue<>( (x,y) -> Integer.compare(x.dist, y.dist));
  48. pq.offer(new Pair(src, 0));
  49.  
  50. // Step-4 Process the nodes present in Min-heap using Dijkstra
  51. while(!pq.isEmpty())
  52. {
  53. Pair pair = pq.poll();
  54. int currentNode = pair.node;
  55. int currentDist = pair.dist;
  56.  
  57. for(iPair adjNode : adj.get(currentNode))
  58. {
  59. int vertex = adjNode.vertex;
  60. int weight = adjNode.weight;
  61.  
  62. if(distance[currentNode] != (int)1e8 && distance[vertex] > currentDist + weight)
  63. {
  64. distance[vertex] = currentDist + weight;
  65. pq.offer(new Pair(vertex, distance[vertex]));
  66. }
  67. }
  68. }
  69. return distance;
  70. }
  71. }