logo

Hur man hittar kortaste vägarna från källan till alla hörn med Dijkstras algoritm

Givet en viktad graf och en källpunkt i grafen, hitta kortaste vägarna från källan till alla andra hörn i den givna grafen.

Notera: Den givna grafen innehåller ingen negativ kant.

Exempel:



Inmatning: src = 0, grafen visas nedan.

lokalt datum
1-(2)

Produktion: 0 4 12 19 21 11 9 8 14
Förklaring: Avståndet från 0 till 1 = 4.
Minsta avstånd från 0 till 2 = 12. 0->1->2
Minsta avstånd från 0 till 3 = 19. 0->1->2->3
Minsta avstånd från 0 till 4 = 21. 0->7->6->5->4
Minsta avstånd från 0 till 5 = 11. 0->7->6->5
Minsta avstånd från 0 till 6 = 9. 0->7->6
Minsta avstånd från 0 till 7 = 8. 0->7
Minsta avstånd från 0 till 8 = 14. 0->1->2->8

Rekommenderad praxis för att implementera Dijkstra-algoritmen Prova det!

Dijkstras algoritm använder Adjacency matris :

Tanken är att generera en SPT (kortaste vägen träd) med en given källa som rot. Underhåll en Adjacency Matrix med två uppsättningar,

  • en uppsättning innehåller hörn som ingår i trädet med den kortaste vägen,
  • annan uppsättning innehåller hörn som ännu inte ingår i trädet med kortaste vägen.

Vid varje steg i algoritmen, hitta en vertex som är i den andra uppsättningen (uppsättningen som ännu inte ingår) och som har ett minsta avstånd från källan.

Algoritm :

  • Skapa ett set sptSet (kortaste vägträdet) som håller reda på hörn som ingår i det kortaste vägträdet, dvs vars minsta avstånd från källan beräknas och slutförs. Till en början är denna uppsättning tom.
  • Tilldela ett avståndsvärde till alla hörn i inmatningsgrafen. Initiera alla avståndsvärden som OÄNDLIG . Tilldela avståndsvärdet 0 för källpunkten så att den väljs först.
  • Medan sptSet inkluderar inte alla hörn
    • Välj en vertex i som inte finns där sptSet och har ett minimiavståndsvärde.
    • Inkludera dig till sptSet .
    • Uppdatera sedan avståndsvärdet för alla intilliggande hörn av i .
      • För att uppdatera avståndsvärdena, iterera genom alla intilliggande hörn.
      • För varje intilliggande vertex i, om summan av avståndsvärdet av i (från källan) och kantens vikt u-v , är mindre än avståndsvärdet för i , uppdatera sedan avståndsvärdet för i .

Notera: Vi använder en boolesk array sptSet[] för att representera uppsättningen av hörn som ingår i SPT . Om ett värde sptSet[v] är sant, så ingår vertex v i SPT , annars inte. Array dist[] används för att lagra de kortaste avståndsvärdena för alla hörn.

fet text css

Illustration av Dijkstra Algorithm :

För att förstå Dijkstras algoritm kan vi ta en graf och hitta den kortaste vägen från källan till alla noder.

Överväg nedanstående graf och src = 0

1-(2)

Steg 1:

  • Uppsättningen sptSet är initialt tom och avstånd som tilldelats hörn är {0, INF, INF, INF, INF, INF, INF, INF} där INF indikerar oändlig.
  • Välj nu spetsen med ett minsta avståndsvärde. Toppunkten 0 är plockad, inkludera den i sptSet . Så sptSet blir {0}. Efter att ha inkluderat 0 till sptSet , uppdatera avståndsvärden för dess intilliggande hörn.
  • Intilliggande hörn på 0 är 1 och 7. Avståndsvärdena 1 och 7 uppdateras till 4 och 8.

Följande subgraf visar hörn och deras avståndsvärden, endast hörn med ändliga avståndsvärden visas. De hörn som ingår i SPT visas i grön Färg.

6


Steg 2:

  • Välj vertex med minsta avståndsvärde och som inte redan ingår i SPT (inte i sptSET ). Toppunkten 1 plockas och läggs till sptSet .
  • sptSet blir nu {0, 1}. Uppdatera avståndsvärdena för intilliggande hörn på 1.
  • Avståndsvärdet för vertex 2 blir 12 .
    4


Steg 3:

  • Välj vertex med minsta avståndsvärde och som inte redan ingår i SPT (inte i sptSET ). Vertex 7 är plockat. Så sptSet nu blir {0, 1, 7}.
  • Uppdatera avståndsvärdena för intilliggande hörn på 7. Avståndsvärdet för vertex 6 och 8 blir ändligt ( 15 och 9 respektive).
    5


Steg 4:

  • Välj vertex med minsta avståndsvärde och som inte redan ingår i SPT (inte i sptSET ). Vertex 6 är plockad. Så sptSet nu blir {0, 1, 7, 6} .
  • Uppdatera avståndsvärdena för intilliggande hörn på 6. Avståndsvärdena för vertex 5 och 8 uppdateras.
    3-(1)


Vi upprepar ovanstående steg tills sptSet inkluderar alla hörn i den givna grafen. Slutligen får vi följande S hortest Path Tree (SPT).

2-(2)

Nedan är implementeringen av ovanstående tillvägagångssätt:

global var i js
C++
// C++ program for Dijkstra's single source shortest path // algorithm. The program is for adjacency matrix // representation of the graph #include  using namespace std; #include  // Number of vertices in the graph #define V 9 // A utility function to find the vertex with minimum // distance value, from the set of vertices not yet included // in shortest path tree int minDistance(int dist[], bool sptSet[]) {  // Initialize min value  int min = INT_MAX, min_index;  for (int v = 0; v < V; v++)  if (sptSet[v] == false && dist[v] <= min)  min = dist[v], min_index = v;  return min_index; } // A utility function to print the constructed distance // array void printSolution(int dist[]) {  cout << 'Vertex 	 Distance from Source' << endl;  for (int i = 0; i < V; i++)  cout << i << ' 				' << dist[i] << endl; } // Function that implements Dijkstra's single source // shortest path algorithm for a graph represented using // adjacency matrix representation void dijkstra(int graph[V][V], int src) {  int dist[V]; // The output array. dist[i] will hold the  // shortest  // distance from src to i  bool sptSet[V]; // sptSet[i] will be true if vertex i is  // included in shortest  // path tree or shortest distance from src to i is  // finalized  // Initialize all distances as INFINITE and stpSet[] as  // false  for (int i = 0; i < V; i++)  dist[i] = INT_MAX, sptSet[i] = false;  // Distance of source vertex from itself is always 0  dist[src] = 0;  // Find shortest path for all vertices  for (int count = 0; count < V - 1; count++) {  // Pick the minimum distance vertex from the set of  // vertices not yet processed. u is always equal to  // src in the first iteration.  int u = minDistance(dist, sptSet);  // Mark the picked vertex as processed  sptSet[u] = true;  // Update dist value of the adjacent vertices of the  // picked vertex.  for (int v = 0; v < V; v++)  // Update dist[v] only if is not in sptSet,  // there is an edge from u to v, and total  // weight of path from src to v through u is  // smaller than current value of dist[v]  if (!sptSet[v] && graph[u][v]  && dist[u] != INT_MAX  && dist[u] + graph[u][v] < dist[v])  dist[v] = dist[u] + graph[u][v];  }  // print the constructed distance array  printSolution(dist); } // driver's code int main() {  /* Let us create the example graph discussed above */  int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },  { 4, 0, 8, 0, 0, 0, 0, 11, 0 },  { 0, 8, 0, 7, 0, 4, 0, 0, 2 },  { 0, 0, 7, 0, 9, 14, 0, 0, 0 },  { 0, 0, 0, 9, 0, 10, 0, 0, 0 },  { 0, 0, 4, 14, 10, 0, 2, 0, 0 },  { 0, 0, 0, 0, 0, 2, 0, 1, 6 },  { 8, 11, 0, 0, 0, 0, 1, 0, 7 },  { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };  // Function call  dijkstra(graph, 0);  return 0; } // This code is contributed by shivanisinghss2110>
C
// C program for Dijkstra's single source shortest path // algorithm. The program is for adjacency matrix // representation of the graph #include  #include  #include  // Number of vertices in the graph #define V 9 // A utility function to find the vertex with minimum // distance value, from the set of vertices not yet included // in shortest path tree int minDistance(int dist[], bool sptSet[]) {  // Initialize min value  int min = INT_MAX, min_index;  for (int v = 0; v < V; v++)  if (sptSet[v] == false && dist[v] <= min)  min = dist[v], min_index = v;  return min_index; } // A utility function to print the constructed distance // array void printSolution(int dist[]) {  printf('Vertex 		 Distance from Source
');  for (int i = 0; i < V; i++)  printf('%d 				 %d
', i, dist[i]); } // Function that implements Dijkstra's single source // shortest path algorithm for a graph represented using // adjacency matrix representation void dijkstra(int graph[V][V], int src) {  int dist[V]; // The output array. dist[i] will hold the  // shortest  // distance from src to i  bool sptSet[V]; // sptSet[i] will be true if vertex i is  // included in shortest  // path tree or shortest distance from src to i is  // finalized  // Initialize all distances as INFINITE and stpSet[] as  // false  for (int i = 0; i < V; i++)  dist[i] = INT_MAX, sptSet[i] = false;  // Distance of source vertex from itself is always 0  dist[src] = 0;  // Find shortest path for all vertices  for (int count = 0; count < V - 1; count++) {  // Pick the minimum distance vertex from the set of  // vertices not yet processed. u is always equal to  // src in the first iteration.  int u = minDistance(dist, sptSet);  // Mark the picked vertex as processed  sptSet[u] = true;  // Update dist value of the adjacent vertices of the  // picked vertex.  for (int v = 0; v < V; v++)  // Update dist[v] only if is not in sptSet,  // there is an edge from u to v, and total  // weight of path from src to v through u is  // smaller than current value of dist[v]  if (!sptSet[v] && graph[u][v]  && dist[u] != INT_MAX  && dist[u] + graph[u][v] < dist[v])  dist[v] = dist[u] + graph[u][v];  }  // print the constructed distance array  printSolution(dist); } // driver's code int main() {  /* Let us create the example graph discussed above */  int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },  { 4, 0, 8, 0, 0, 0, 0, 11, 0 },  { 0, 8, 0, 7, 0, 4, 0, 0, 2 },  { 0, 0, 7, 0, 9, 14, 0, 0, 0 },  { 0, 0, 0, 9, 0, 10, 0, 0, 0 },  { 0, 0, 4, 14, 10, 0, 2, 0, 0 },  { 0, 0, 0, 0, 0, 2, 0, 1, 6 },  { 8, 11, 0, 0, 0, 0, 1, 0, 7 },  { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };  // Function call  dijkstra(graph, 0);  return 0; }>
Java
// A Java program for Dijkstra's single source shortest path // algorithm. The program is for adjacency matrix // representation of the graph import java.io.*; import java.lang.*; import java.util.*; class ShortestPath {  // A utility function to find the vertex with minimum  // distance value, from the set of vertices not yet  // included in shortest path tree  static final int V = 9;  int minDistance(int dist[], Boolean sptSet[])  {  // Initialize min value  int min = Integer.MAX_VALUE, min_index = -1;  for (int v = 0; v < V; v++)  if (sptSet[v] == false && dist[v] <= min) {  min = dist[v];  min_index = v;  }  return min_index;  }  // A utility function to print the constructed distance  // array  void printSolution(int dist[])  {  System.out.println(  'Vertex 		 Distance from Source');  for (int i = 0; i < V; i++)  System.out.println(i + ' 		 ' + dist[i]);  }  // Function that implements Dijkstra's single source  // shortest path algorithm for a graph represented using  // adjacency matrix representation  void dijkstra(int graph[][], int src)  {  int dist[] = new int[V]; // The output array.  // dist[i] will hold  // the shortest distance from src to i  // sptSet[i] will true if vertex i is included in  // shortest path tree or shortest distance from src  // to i is finalized  Boolean sptSet[] = new Boolean[V];  // Initialize all distances as INFINITE and stpSet[]  // as false  for (int i = 0; i < V; i++) {  dist[i] = Integer.MAX_VALUE;  sptSet[i] = false;  }  // Distance of source vertex from itself is always 0  dist[src] = 0;  // Find shortest path for all vertices  for (int count = 0; count < V - 1; count++) {  // Pick the minimum distance vertex from the set  // of vertices not yet processed. u is always  // equal to src in first iteration.  int u = minDistance(dist, sptSet);  // Mark the picked vertex as processed  sptSet[u] = true;  // Update dist value of the adjacent vertices of  // the picked vertex.  for (int v = 0; v < V; v++)  // Update dist[v] only if is not in sptSet,  // there is an edge from u to v, and total  // weight of path from src to v through u is  // smaller than current value of dist[v]  if (!sptSet[v] && graph[u][v] != 0  && dist[u] != Integer.MAX_VALUE  && dist[u] + graph[u][v] < dist[v])  dist[v] = dist[u] + graph[u][v];  }  // print the constructed distance array  printSolution(dist);  }  // Driver's code  public static void main(String[] args)  {  /* Let us create the example graph discussed above  */  int graph[][]  = new int[][] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },  { 4, 0, 8, 0, 0, 0, 0, 11, 0 },  { 0, 8, 0, 7, 0, 4, 0, 0, 2 },  { 0, 0, 7, 0, 9, 14, 0, 0, 0 },  { 0, 0, 0, 9, 0, 10, 0, 0, 0 },  { 0, 0, 4, 14, 10, 0, 2, 0, 0 },  { 0, 0, 0, 0, 0, 2, 0, 1, 6 },  { 8, 11, 0, 0, 0, 0, 1, 0, 7 },  { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };  ShortestPath t = new ShortestPath();  // Function call  t.dijkstra(graph, 0);  } } // This code is contributed by Aakash Hasija>
Pytonorm
# Python program for Dijkstra's single # source shortest path algorithm. The program is # for adjacency matrix representation of the graph # Library for INT_MAX import sys class Graph(): def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] def printSolution(self, dist): print('Vertex 	Distance from Source') for node in range(self.V): print(node, '	', dist[node]) # A utility function to find the vertex with # minimum distance value, from the set of vertices # not yet included in shortest path tree def minDistance(self, dist, sptSet): # Initialize minimum distance for next node min = sys.maxsize # Search not nearest vertex not in the # shortest path tree for u in range(self.V): if dist[u] < min and sptSet[u] == False: min = dist[u] min_index = u return min_index # Function that implements Dijkstra's single source # shortest path algorithm for a graph represented # using adjacency matrix representation def dijkstra(self, src): dist = [sys.maxsize] * self.V dist[src] = 0 sptSet = [False] * self.V for cout in range(self.V): # Pick the minimum distance vertex from # the set of vertices not yet processed. # x is always equal to src in first iteration x = self.minDistance(dist, sptSet) # Put the minimum distance vertex in the # shortest path tree sptSet[x] = True # Update dist value of the adjacent vertices # of the picked vertex only if the current # distance is greater than new distance and # the vertex in not in the shortest path tree for y in range(self.V): if self.graph[x][y]>0 och sptSet[y] == Falskt och  dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Förarens kod om __namn__ == '__main__': g = Graph(9) g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0], [4, 0, 8, 0, 0, 0, 0, 11, 0], [0, 8, 0, 7, 0, 4, 0, 0, 2], [0, 0, 7, 0, 9, 14, 0, 0, 0], [0, 0, 0, 9, 0, 10, 0, 0, 0], [0, 0, 4, 14, 10, 0, 2, 0, 0], [0, 0, 0, 0, 0, 2, 0, 1, 6], [8, 11, 0, 0, 0, 0, 1, 0, 7], [0, 0, 2, 0, 0, 0, 6, 7, 0] ] g.dijkstra(0) # Denna kod är bidragit av Divyanshu Mehta och uppdaterad av Pranav Singh Sambyal>
C#
// C# program for Dijkstra's single // source shortest path algorithm. // The program is for adjacency matrix // representation of the graph using System; class GFG {  // A utility function to find the  // vertex with minimum distance  // value, from the set of vertices  // not yet included in shortest  // path tree  static int V = 9;  int minDistance(int[] dist, bool[] sptSet)  {  // Initialize min value  int min = int.MaxValue, min_index = -1;  for (int v = 0; v < V; v++)  if (sptSet[v] == false && dist[v] <= min) {  min = dist[v];  min_index = v;  }  return min_index;  }  // A utility function to print  // the constructed distance array  void printSolution(int[] dist)  {  Console.Write('Vertex 		 Distance '  + 'from Source
');  for (int i = 0; i < V; i++)  Console.Write(i + ' 		 ' + dist[i] + '
');  }  // Function that implements Dijkstra's  // single source shortest path algorithm  // for a graph represented using adjacency  // matrix representation  void dijkstra(int[, ] graph, int src)  {  int[] dist  = new int[V]; // The output array. dist[i]  // will hold the shortest  // distance from src to i  // sptSet[i] will true if vertex  // i is included in shortest path  // tree or shortest distance from  // src to i is finalized  bool[] sptSet = new bool[V];  // Initialize all distances as  // INFINITE and stpSet[] as false  for (int i = 0; i < V; i++) {  dist[i] = int.MaxValue;  sptSet[i] = false;  }  // Distance of source vertex  // from itself is always 0  dist[src] = 0;  // Find shortest path for all vertices  for (int count = 0; count < V - 1; count++) {  // Pick the minimum distance vertex  // from the set of vertices not yet  // processed. u is always equal to  // src in first iteration.  int u = minDistance(dist, sptSet);  // Mark the picked vertex as processed  sptSet[u] = true;  // Update dist value of the adjacent  // vertices of the picked vertex.  for (int v = 0; v < V; v++)  // Update dist[v] only if is not in  // sptSet, there is an edge from u  // to v, and total weight of path  // from src to v through u is smaller  // than current value of dist[v]  if (!sptSet[v] && graph[u, v] != 0  && dist[u] != int.MaxValue  && dist[u] + graph[u, v] < dist[v])  dist[v] = dist[u] + graph[u, v];  }  // print the constructed distance array  printSolution(dist);  }  // Driver's Code  public static void Main()  {  /* Let us create the example graph discussed above */  int[, ] graph  = new int[, ] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },  { 4, 0, 8, 0, 0, 0, 0, 11, 0 },  { 0, 8, 0, 7, 0, 4, 0, 0, 2 },  { 0, 0, 7, 0, 9, 14, 0, 0, 0 },  { 0, 0, 0, 9, 0, 10, 0, 0, 0 },  { 0, 0, 4, 14, 10, 0, 2, 0, 0 },  { 0, 0, 0, 0, 0, 2, 0, 1, 6 },  { 8, 11, 0, 0, 0, 0, 1, 0, 7 },  { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };  GFG t = new GFG();  // Function call  t.dijkstra(graph, 0);  } } // This code is contributed by ChitraNayal>
Javascript
// A Javascript program for Dijkstra's single  // source shortest path algorithm.  // The program is for adjacency matrix  // representation of the graph  let V = 9; // A utility function to find the  // vertex with minimum distance  // value, from the set of vertices  // not yet included in shortest  // path tree  function minDistance(dist,sptSet) {    // Initialize min value   let min = Number.MAX_VALUE;  let min_index = -1;    for(let v = 0; v < V; v++)  {  if (sptSet[v] == false && dist[v] <= min)   {  min = dist[v];  min_index = v;  }  }  return min_index; } // A utility function to print  // the constructed distance array  function printSolution(dist) {  console.log('Vertex 		 Distance from Source ');  for(let i = 0; i < V; i++)  {  console.log(i + ' 		 ' +   dist[i] + ' ');  } } // Function that implements Dijkstra's  // single source shortest path algorithm  // for a graph represented using adjacency  // matrix representation  function dijkstra(graph, src) {  let dist = new Array(V);  let sptSet = new Array(V);    // Initialize all distances as   // INFINITE and stpSet[] as false   for(let i = 0; i < V; i++)  {  dist[i] = Number.MAX_VALUE;  sptSet[i] = false;  }    // Distance of source vertex   // from itself is always 0   dist[src] = 0;    // Find shortest path for all vertices   for(let count = 0; count < V - 1; count++)  {    // Pick the minimum distance vertex   // from the set of vertices not yet   // processed. u is always equal to   // src in first iteration.   let u = minDistance(dist, sptSet);    // Mark the picked vertex as processed   sptSet[u] = true;    // Update dist value of the adjacent   // vertices of the picked vertex.   for(let v = 0; v < V; v++)  {    // Update dist[v] only if is not in   // sptSet, there is an edge from u   // to v, and total weight of path   // from src to v through u is smaller   // than current value of dist[v]   if (!sptSet[v] && graph[u][v] != 0 &&   dist[u] != Number.MAX_VALUE &&  dist[u] + graph[u][v] < dist[v])  {  dist[v] = dist[u] + graph[u][v];  }  }  }    // Print the constructed distance array  printSolution(dist); } // Driver code let graph = [ [ 0, 4, 0, 0, 0, 0, 0, 8, 0 ],  [ 4, 0, 8, 0, 0, 0, 0, 11, 0 ],  [ 0, 8, 0, 7, 0, 4, 0, 0, 2 ],  [ 0, 0, 7, 0, 9, 14, 0, 0, 0],  [ 0, 0, 0, 9, 0, 10, 0, 0, 0 ],  [ 0, 0, 4, 14, 10, 0, 2, 0, 0],  [ 0, 0, 0, 0, 0, 2, 0, 1, 6 ],  [ 8, 11, 0, 0, 0, 0, 1, 0, 7 ],  [ 0, 0, 2, 0, 0, 0, 6, 7, 0 ] ] dijkstra(graph, 0); // This code is contributed by rag2127>

Produktion
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>

Tidskomplexitet: O(V2)
Hjälputrymme: O(V)

Anmärkningar:

  • Koden beräknar det kortaste avståndet men beräknar inte väginformationen. Skapa en överordnad array, uppdatera den överordnade arrayen när avståndet uppdateras och använd den för att visa den kortaste vägen från källan till olika hörn.
  • Tiden Komplexiteten för implementeringen är O(V 2 ) . Om ingången grafen representeras med hjälp av angränsande lista , kan den reduceras till O(E * log V) med hjälp av en binär hög. Snälla se Dijkstra's Algorithm for Adjacency List Representation för mer detaljer.
  • Dijkstras algoritm fungerar inte för grafer med negativa viktcykler.

Varför misslyckas Dijkstras algoritmer för att graferna har negativa kanter?

Problemet med negativa vikter uppstår från det faktum att Dijkstras algoritm antar att när en nod väl läggs till uppsättningen av besökta noder, är dess avstånd slutfört och kommer inte att ändras. Men i närvaro av negativa vikter kan detta antagande leda till felaktiga resultat.

Betrakta följande graf för exemplet:

len av sträng i java
Fel-av-Dijkstra-i-fall-negativa-kanter

I grafen ovan är A källnoden, bland kanterna A till B och A till C , A till B är den mindre vikten och Dijkstra tilldelar det kortaste avståndet på B som 2, men på grund av förekomsten av en negativ kant från C till B , minskar det faktiska kortaste avståndet till 1 vilket Dijkstra inte kan upptäcka.

Notera: Vi använder Bellman Fords Shortest path-algoritm om vi har negativa kanter i grafen.

Dijkstras algoritm använder Adjacency List i O(E logV):

För Dijkstras algoritm rekommenderas den alltid att använda Närhelst avståndet för en vertex reduceras, lägger vi till ytterligare en instans av en vertex i priority_queue. Även om det finns flera instanser tar vi bara hänsyn till instansen med minsta avstånd och ignorerar andra instanser.

  • Tidskomplexiteten kvarstår O(E * LogV) eftersom det som mest kommer att finnas O(E) hörn i prioritetskön och O(logE) är samma som O(logV)
  • Nedan är implementeringen av ovanstående tillvägagångssätt:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Heltal Par typdef par iPair; // Denna klass representerar en riktad graf som använder // adjacency list representation class Graph { int V; // Antal hörn // I en viktad graf måste vi lagra vertex // och viktpar för varje kantlista>* adj; public: Graph(int V); // Constructor // funktion för att lägga till en kant till grafen void addEdge(int u, int v, int w);  // skriver ut kortaste vägen från s void shortestPath(int s); }; // Tilldelar minne för angränsande lista Graph::Graph(int V) { this->V = V;  adj = ny lista [V]; } void Graph::addEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w));  adj[v].push_back(make_pair(u, w)); } // Skriver ut kortaste vägarna från källan till alla andra hörn void Graph::shortestPath(int src) { // Skapa en prioritetskö för att lagra hörn som // håller på att förbehandlas. Detta är konstig syntax i C++.  // Se länken nedan för information om denna syntax // https://www.techcodeview.com priority_queue , större > pq;  // Skapa en vektor för avstånd och initiera alla // avstånd som oändlig (INF) vektor dist(V, INF);  // Infoga själva källkoden i prioritetskön och initiera // dess avstånd som 0. pq.push(make_pair(0, src));  dist[källa] = 0;  /* Looping tills prioritetskön blir tom (eller alla avstånd är inte slutförda) */ while (!pq.empty()) { // Den första vertexen i par är det minsta avståndet // vertex, extrahera den från prioritetskön.  // vertexetiketten lagras i andra av paret (det // måste göras på detta sätt för att hålla hörnen // sorterat avstånd (avståndet måste vara första objektet // i par) int u = pq.top().second; pq.pop(); // 'i' används för att få alla intilliggande hörn av en // vertexlista>::iterator i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Få vertexetikett och vikt av nuvarande // intill u.  int v = (*i).först;  int vikt = (*i).sekund;  // Om det är kortad väg till v genom u.  if (avstånd[v]> dist[u] + vikt) { // Uppdatering av avstånd för v dist[v] = dist[u] + vikt;  pq.push(make_pair(avstånd[v], v));  } } } // Skriv ut kortaste avstånd lagrade i dist[] printf('Vertexavstånd från källa
    ');  för (int i = 0; i< V; ++i)  printf('%d 		 %d
    ', i, dist[i]); } // Driver's code int main() {  // create the graph given in above figure  int V = 9;  Graph g(V);  // making above shown graph  g.addEdge(0, 1, 4);  g.addEdge(0, 7, 8);  g.addEdge(1, 2, 8);  g.addEdge(1, 7, 11);  g.addEdge(2, 3, 7);  g.addEdge(2, 8, 2);  g.addEdge(2, 5, 4);  g.addEdge(3, 4, 9);  g.addEdge(3, 5, 14);  g.addEdge(4, 5, 10);  g.addEdge(5, 6, 2);  g.addEdge(6, 7, 1);  g.addEdge(6, 8, 6);  g.addEdge(7, 8, 7);  // Function call  g.shortestPath(0);  return 0; }>
    Java
    import java.util.*; class Graph {  private int V;  private List> adj;  Graph(int V) { this.V = V;  adj = new ArrayList();  för (int i = 0; i< V; i++) {  adj.add(new ArrayList());  }  }  void addEdge(int u, int v, int w) {  adj.get(u).add(new iPair(v, w));  adj.get(v).add(new iPair(u, w));  }  void shortestPath(int src) {  PriorityQueue pq = new PriorityQueue(V, Comparator.comparingInt(o -> o.second));  int[] dist = ny int[V];  Arrays.fill(avstånd, heltal.MAX_VALUE);  pq.add(ny iPair(0, src));  dist[källa] = 0;  while (!pq.isEmpty()) { int u = pq.poll().second;  for (iPair v : adj.get(u)) { if (dist[v.first]> dist[u] + v.second) { dist[v.first] = dist[u] + v.second;  pq.add(ny iPair(avstånd[v.först], v.först));  } } } System.out.println('Vertexavstånd från källa');  för (int i = 0; i< V; i++) {  System.out.println(i + '		' + dist[i]);  }  }  static class iPair {  int first, second;  iPair(int first, int second) {  this.first = first;  this.second = second;  }  } } public class Main {  public static void main(String[] args) {  int V = 9;  Graph g = new Graph(V);  g.addEdge(0, 1, 4);  g.addEdge(0, 7, 8);  g.addEdge(1, 2, 8);  g.addEdge(1, 7, 11);  g.addEdge(2, 3, 7);  g.addEdge(2, 8, 2);  g.addEdge(2, 5, 4);  g.addEdge(3, 4, 9);  g.addEdge(3, 5, 14);  g.addEdge(4, 5, 10);  g.addEdge(5, 6, 2);  g.addEdge(6, 7, 1);  g.addEdge(6, 8, 6);  g.addEdge(7, 8, 7);  g.shortestPath(0);  } }>
    Pytonorm
    import heapq # iPair ==>Heltalspar iPair = tuppel # Den här klassen representerar en riktad graf med # närliggande listrepresentationsklass Graph: def __init__(self, V: int): # Konstruktör själv.V = V self.adj = [[] för _ i intervall(V) )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u,w)) # Skriver ut kortaste vägarna från källan till alla andra hörn def shortestPath(self, src: int): # Skapa en prioritetskö för att lagra hörn som # håller på att förbehandlas pq = [] heapq.heappush(pq, (0, src)) # Skapa en vektor för avstånd och initiera alla # avstånd som oändliga (INF) dist = [float('inf')] * self.V dist[src] = 0 medan pq: # Det första hörnet i par är det minsta avståndet # vertex, extrahera det från prioritetskön. # vertexetikett lagras i andra av par d, u = heapq.heappop(pq) # 'i' används för att få alla intilliggande hörn av en # vertex för v, vikt i self.adj[u]: # If det är kortad väg till v genom u. if dist[v]> dist[u] + vikt: # Uppdaterar avstånd för v dist[v] = dist[u] + vikt heapq.heappush(pq, (dist[v], v)) # Skriv ut kortaste avstånd lagrade i dist[] för i in range(self.V): print(f'{i} 		 {dist[i]}') # Drivers code if __name__ == '__main__': # skapa grafen som ges i figuren ovan V = 9 g = Graph(V) # gör ovanstående visade graf g.addEdge(0, 1, 4) g.addEdge(0, 7, 8) g.addEdge(1, 2, 8) g.addEdge(1, 7, 11) g.addEdge(2, 3, 7) g.addEdge(2, 8, 2) g.addEdge(2, 5, 4) g.addEdge(3, 4, 9) g.addEdge(3, 5, 14) g.addEdge(4, 5, 10) g.addEdge(5, 6, 2) g.addEdge(6, 7, 1) g.addEdge(6, 8, 6) g.addEdge(7, 8, 7) g.shortestPath(0)>
    C#
    using System; using System.Collections.Generic; // This class represents a directed graph using // adjacency list representation public class Graph {  private const int INF = 2147483647;  private int V;  private List [] adj;  public Graph(int V) { // Antal hörn detta.V = V;  // I en viktad graf måste vi lagra vertex // och viktpar för varje kant this.adj = new List [V];  för (int i = 0; i< V; i++)  {  this.adj[i] = new List ();  } } public void AddEdge(int u, int v, int w) { this.adj[u].Add(new int[] { v, w });  this.adj[v].Add(new int[] { u, w });  } // Skriver ut kortaste vägarna från källan till alla andra hörn public void ShortestPath(int src) { // Skapa en prioritetskö för att lagra hörn som // förbehandlas.  SorteradSet pq = nytt SorteratSet (ny DistanceComparer());  // Skapa en array för avstånd och initiera alla // avstånd som oändliga (INF) int[] dist = new int[V];  för (int i = 0; i< V; i++)  {  dist[i] = INF;  }  // Insert source itself in priority queue and initialize  // its distance as 0.  pq.Add(new int[] { 0, src });  dist[src] = 0;  /* Looping till priority queue becomes empty (or all  distances are not finalized) */  while (pq.Count>0) { // Det första hörnet i par är det minsta avståndet // vertex, extrahera det från prioritetskön.  // vertexetiketten lagras i andra av paret (det // måste göras på detta sätt för att hålla hörnen // sorterade efter avstånd) int[] minDistVertex = pq.Min;  pq.Remove(minDistVertex);  int u = minDistVertex[1];  // 'i' används för att få alla intilliggande hörn av en // vertex foreach (int[] adjVertex i this.adj[u]) { // Få vertexetikett och vikt av nuvarande // intill u.  int v = adjVertex[0];  int vikt = adjVertex[1];  // Om det finns en kortare väg till v genom u.  if (avstånd[v]> dist[u] + vikt) { // Uppdatering av avstånd för v dist[v] = dist[u] + vikt;  pq.Add(new int[] { dist[v], v });  } } } // Skriv ut kortaste avstånd lagrade i dist[] Console.WriteLine('Vertex Distance from Source');  för (int i = 0; i< V; ++i)  Console.WriteLine(i + '	' + dist[i]);  }  private class DistanceComparer : IComparer { public int Compare(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1];  } returnera x[0] - y[0];  } } } public class Program { // Driver Code public static void Main() { // skapa grafen som ges i ovanstående figur int V = 9;  Graph g = new Graph(V);  // gör ovanstående visade graf g.AddEdge(0, 1, 4);  g.AddEdge(0, 7, 8);  g.AddEdge(1, 2, 8);  g.AddEdge(1, 7, 11);  g.AddEdge(2, 3, 7);  g.AddEdge(2, 8, 2);  g.AddEdge(2, 5, 4);  g.AddEdge(3, 4, 9);  g.AddEdge(3, 5, 14);  g.AddEdge(4, 5, 10);  g.AddEdge(5, 6, 2);  g.AddEdge(6, 7, 1);  g.AddEdge(6, 8, 6);  g.AddEdge(7, 8, 7);  g.ShortestPath(0);  } } // denna kod bidrar med bhardwajji>
    Javascript
    // javascript Program to find Dijkstra's shortest path using // priority_queue in STL const INF = 2147483647; // This class represents a directed graph using // adjacency list representation class Graph {    constructor(V){    // No. of vertices  this.V = V;    // In a weighted graph, we need to store vertex  // and weight pair for every edge  this.adj = new Array(V);  for(let i = 0; i < V; i++){  this.adj[i] = new Array();  }  }  addEdge(u, v, w)  {  this.adj[u].push([v, w]);  this.adj[v].push([u, w]);  }  // Prints shortest paths from src to all other vertices  shortestPath(src)  {  // Create a priority queue to store vertices that  // are being preprocessed. This is weird syntax in C++.  // Refer below link for details of this syntax  // https://www.techcodeview.com  let pq = [];  // Create a vector for distances and initialize all  // distances as infinite (INF)  let dist = new Array(V).fill(INF);  // Insert source itself in priority queue and initialize  // its distance as 0.  pq.push([0, src]);  dist[src] = 0;  /* Looping till priority queue becomes empty (or all  distances are not finalized) */  while (pq.length>0) { // Det första hörnet i par är det minsta avståndet // vertex, extrahera det från prioritetskön.  // vertexetiketten lagras i andra av paret (det // måste göras på detta sätt för att hålla hörnen // sorterat avstånd (avståndet måste vara första objektet // i par) let u = pq[0][1]; pq.shift(); // 'i' används för att få alla intilliggande hörn av en // vertex för(låt i = 0; i< this.adj[u].length; i++){    // Get vertex label and weight of current  // adjacent of u.  let v = this.adj[u][i][0];  let weight = this.adj[u][i][1];  // If there is shorted path to v through u.  if (dist[v]>dist[u] + vikt) { // Uppdatering av avstånd för v dist[v] = dist[u] + vikt;  pq.push([avstånd[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; });  } } } // Skriv ut kortaste avstånd lagrade i dist[] console.log('Vertex Distance from Source');  för (låt i = 0; i< V; ++i)  console.log(i, ' ', dist[i]);  } } // Driver's code // create the graph given in above figure let V = 9; let g = new Graph(V); // making above shown graph g.addEdge(0, 1, 4); g.addEdge(0, 7, 8); g.addEdge(1, 2, 8); g.addEdge(1, 7, 11); g.addEdge(2, 3, 7); g.addEdge(2, 8, 2); g.addEdge(2, 5, 4); g.addEdge(3, 4, 9); g.addEdge(3, 5, 14); g.addEdge(4, 5, 10); g.addEdge(5, 6, 2); g.addEdge(6, 7, 1); g.addEdge(6, 8, 6); g.addEdge(7, 8, 7); // Function call g.shortestPath(0); // The code is contributed by Nidhi goel.>

    Produktion
    Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>

    Tidskomplexitet: O(E * logV), där E är antalet kanter och V är antalet hörn.
    Hjälputrymme: O(V)

    Tillämpningar av Dijkstras algoritm:

    • Google kartor använder Dijkstra-algoritmen för att visa kortaste avståndet mellan källa och destination.
    • I datornätverk , Dijkstras algoritm ligger till grund för olika routingprotokoll, såsom OSPF (Open Shortest Path First) och IS-IS (Intermediate System to Intermediate System).
    • Transport- och trafikledningssystem använder Dijkstras algoritm för att optimera trafikflödet, minimera trafikstockningar och planera de mest effektiva vägarna för fordon.
    • Flygbolag använder Dijkstras algoritm för att planera flygvägar som minimerar bränsleförbrukningen, minskar restiden.
    • Dijkstras algoritm används i elektronisk designautomation för routing av anslutningar på integrerade kretsar och mycket storskalig integration (VLSI) chips.

    För en mer detaljerad förklaring se den här artikeln Dijkstras Shortest Path Algorithm använder priority_queue av STL .