logo

Com trobar els camins més curts des de la font fins a tots els vèrtexs mitjançant l'algoritme de Dijkstra

Donat un gràfic ponderat i un vèrtex font al gràfic, trobeu el camins més curts des de la font fins a tots els altres vèrtexs del gràfic donat.

Nota: El gràfic donat no conté cap aresta negativa.

Exemples:



Entrada: src = 0, el gràfic es mostra a continuació.

1-(2)

Sortida: 0 4 12 19 21 11 9 8 14
Explicació: La distància de 0 a 1 = 4.
La distància mínima de 0 a 2 = 12. 0->1->2
La distància mínima de 0 a 3 = 19. 0->1->2->3
La distància mínima de 0 a 4 = 21. 0->7->6->5->4
La distància mínima de 0 a 5 = 11. 0->7->6->5
La distància mínima de 0 a 6 = 9. 0->7->6
La distància mínima de 0 a 7 = 8. 0->7
La distància mínima de 0 a 8 = 14. 0->1->2->8

Pràctica recomanada per implementar l'algoritme Dijkstra Prova-ho!

Utilitzant l'algoritme de Dijkstra Matriu d'adjacència :

La idea és generar un SPT (arbre del camí més curt) amb una font determinada com a arrel. Mantenir una matriu d'adjacència amb dos conjunts,

  • un conjunt conté vèrtexs inclosos a l'arbre del camí més curt,
  • un altre conjunt inclou vèrtexs que encara no s'inclouen a l'arbre del camí més curt.

A cada pas de l'algorisme, trobeu un vèrtex que estigui a l'altre conjunt (conjunt encara no inclòs) i tingui una distància mínima de la font.

Algoritme :

  • Crea un conjunt sptSet (conjunt d'arbres del camí més curt) que fa un seguiment dels vèrtexs inclosos a l'arbre del camí més curt, és a dir, la distància mínima del qual des de la font es calcula i es finalitza. Inicialment, aquest conjunt està buit.
  • Assigna un valor de distància a tots els vèrtexs del gràfic d'entrada. Inicialitzar tots els valors de distància com a INFINIT . Assigna el valor de la distància com a 0 per al vèrtex font perquè es triï primer.
  • Mentre sptSet no inclou tots els vèrtexs
    • Trieu un vèrtex en que no hi és sptSet i té un valor de distància mínima.
    • Incloure't sptSet .
    • A continuació, actualitzeu el valor de la distància de tots els vèrtexs adjacents de en .
      • Per actualitzar els valors de la distància, itera per tots els vèrtexs adjacents.
      • Per a cada vèrtex adjacent en, si la suma del valor de la distància de en (de la font) i pes de la vora u-v , és inferior al valor de distància de en i, a continuació, actualitzeu el valor de distància de en .

Nota: Utilitzem una matriu booleana sptSet[] per representar el conjunt de vèrtexs inclòs en SPT . Si un valor sptSet[v] és cert, aleshores s'inclou el vèrtex v SPT , en cas contrari no. Matriu dist[] s'utilitza per emmagatzemar els valors de distància més curta de tots els vèrtexs.

Il·lustració de l'algoritme Dijkstra :

Per entendre l'algoritme de Dijkstra, fem un gràfic i trobem el camí més curt des de la font fins a tots els nodes.

Considereu el gràfic següent i src = 0

1-(2)

Pas 1:

  • El conjunt sptSet inicialment està buit i les distàncies assignades als vèrtexs són {0, INF, INF, INF, INF, INF, INF, INF} on INF indica infinit.
  • Ara trieu el vèrtex amb un valor de distància mínima. Es tria el vèrtex 0, inclou-lo sptSet . Tan sptSet es converteix en {0}. Després d'incloure 0 a sptSet , actualitza els valors de distància dels seus vèrtexs adjacents.
  • Els vèrtexs adjacents de 0 són 1 i 7. Els valors de distància d'1 i 7 s'actualitzen com a 4 i 8.

El subgràfic següent mostra els vèrtexs i els seus valors de distància, només es mostren els vèrtexs amb valors de distància finits. Els vèrtexs inclosos a SPT es mostren a verd color.

6


Pas 2:

  • Trieu el vèrtex amb el valor de distància mínima i que ja no s'inclou SPT (no dins sptSET ). S'escull el vèrtex 1 i s'hi afegeix sptSet .
  • Tan sptSet ara es converteix en {0, 1}. Actualitzeu els valors de distància dels vèrtexs adjacents d'1.
  • El valor de distància del vèrtex 2 esdevé 12 .
    4


Pas 3:

  • Trieu el vèrtex amb el valor de distància mínima i que ja no s'inclou SPT (no dins sptSET ). S'escull el vèrtex 7. Tan sptSet ara esdevé {0, 1, 7}.
  • Actualitzeu els valors de distància dels vèrtexs adjacents de 7. El valor de distància dels vèrtexs 6 i 8 esdevé finit ( 15 i 9 respectivament).
    5


Pas 4:

  • Trieu el vèrtex amb el valor de distància mínima i que ja no s'inclou SPT (no dins sptSET ). S'escull el vèrtex 6. Tan sptSet ara esdevé {0, 1, 7, 6} .
  • Actualitzeu els valors de distància dels vèrtexs adjacents de 6. S'actualitzen els valors de distància dels vèrtexs 5 i 8.
    3-(1)


Repetim els passos anteriors fins que sptSet inclou tots els vèrtexs del gràfic donat. Finalment, obtenim el següent S Hortest Path Tree (SPT).

2-(2)

A continuació es mostra la implementació de l'enfocament anterior:

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>
Python
# 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 i sptSet[y] == Fals i  dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Codi del controlador si __name__ == '__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) # Aquest codi és aportat per Divyanshu Mehta i actualitzat per Pranav Singh Sambyal>>>C#
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>

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

Complexitat temporal: O (V2)
Espai auxiliar: O(V)

Notes:

  • El codi calcula la distància més curta però no calcula la informació del camí. Creeu una matriu principal, actualitzeu la matriu principal quan s'actualitzi la distància i utilitzeu-la per mostrar el camí més curt des de la font fins a diferents vèrtexs.
  • El temps és la complexitat de la implementació O (V 2 ) . Si l'entrada El gràfic es representa mitjançant una llista d'adjacència , es pot reduir a O(E * log V) amb l'ajuda d'un munt binari. Siusplau mira Algoritme de Dijkstra per a la representació de la llista d'adjacència per a més detalls.
  • L'algorisme de Dijkstra no funciona per a gràfics amb cicles de pes negatius.

Per què fallen els algorismes de Dijkstra per als gràfics que tenen arestes negatives?

El problema amb els pesos negatius sorgeix del fet que l'algoritme de Dijkstra suposa que un cop s'afegeix un node al conjunt de nodes visitats, la seva distància es finalitza i no canviarà. Tanmateix, en presència de pesos negatius, aquesta hipòtesi pot conduir a resultats incorrectes.

Considereu el gràfic següent per a l'exemple:

Fallada-de-Dijkstra-en-cas-de-vores-negatives

Al gràfic anterior, A és el node font, entre les vores A a B i A a C , A a B és el pes més petit i Dijkstra assigna la distància més curta de B com 2, però a causa de l'existència d'una vora negativa de C a B , la distància real més curta es redueix a 1 que Dijkstra no detecta.

Nota: Fem servir Algorisme del camí més curt de Bellman Ford en cas que tinguem arestes negatives a la gràfica.

falla general de protecció

Utilitza l'algoritme de Dijkstra Llista d'adjacència en O(E logV):

Per a l'algorisme de Dijkstra, sempre es recomana utilitzar-lo Sempre que es redueix la distància d'un vèrtex, afegim una instància més d'un vèrtex a priority_queue. Fins i tot si hi ha diverses instàncies, només considerem la instància amb una distància mínima i ignorem altres instàncies.

  • La complexitat temporal es manté O(E * LogV) com a màxim hi haurà vèrtexs O (E) a la cua de prioritats i O (logE) és el mateix que O (logV)
  • A continuació es mostra la implementació de l'enfocament anterior:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Parell enter parell typedef iPair; // Aquesta classe representa un gràfic dirigit utilitzant // classe de representació de llista d'adjacència Graph { int V; // Nombre de vèrtexs // En un gràfic ponderat, hem d'emmagatzemar el vèrtex // i el parell de pes per a cada llista d'arestes>> adj; públic: Graph(int V); // Constructor // funció per afegir una vora al gràfic void addEdge(int u, int v, int w);  // imprimeix el camí més curt des de s void shortestPath(int s); }; // Assigna memòria per a la llista d'adjacència Graph::Graph(int V) { this->V = V;  adj = llista nova [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)); } // Imprimeix els camins més curts des de src a tots els altres vèrtexs void Graph::shortestPath(int src) { // Crea una cua de prioritats per emmagatzemar els vèrtexs que // s'estan preprocessant. Aquesta és una sintaxi estranya en C++.  // Consulteu l'enllaç següent per obtenir més informació sobre aquesta sintaxi // https://www.techcodeview.com priority_queue , més gran > pq;  // Crea un vector per a distàncies i inicialitza totes les // distàncies com a vector infinit (INF). dist(V, INF);  // Insereix la pròpia font a la cua de prioritats i inicialitza // la seva distància com a 0. pq.push(make_pair(0, src));  dist[src] = 0;  /* Recorrent fins que la cua de prioritat es buida (o no es finalitzin totes les distàncies) */ while (!pq.empty()) { // El primer vèrtex del parell és la distància mínima // vèrtex, extreu-lo de la cua de prioritats.  // L'etiqueta de vèrtex s'emmagatzema en segon de parell (s'ha de fer // d'aquesta manera per mantenir els vèrtexs // distància ordenada (la distància ha de ser el primer element // en parella) int u = pq.top().second; pq.pop(); // 'i' s'utilitza per obtenir tots els vèrtexs adjacents d'una // llista de vèrtexs>::iterador i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Obteniu l'etiqueta del vèrtex i el pes de l'actual // adjacent a u.  int v = (*i).primer;  int pes = (*i).segon;  // Si hi ha un camí curt a v a través de u.  if (dist[v]> dist[u] + pes) { // Actualització de la distància de v dist[v] = dist[u] + pes;  pq.push(make_pair(dist[v], v));  } } } // Imprimeix les distàncies més curtes emmagatzemades a dist[] printf('Distància del vèrtex des de la font
    ');  per (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;  Gràfic(int V) { això.V = V;  adj = new ArrayList();  per (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 = nou int[V];  Arrays.fill(dist, Integer.MAX_VALUE);  pq.add(nou iPair(0, src));  dist[src] = 0;  mentre que (!pq.isEmpty()) { int u = pq.poll().segon;  for (iPair v: adj.get(u)) { if (dist[v.first]> dist[u] + v.segon) { dist[v.first] = dist[u] + v.segon;  pq.add(nou iPair(dist[v.first], v.first));  } } } System.out.println('Distància del vèrtex des de la font');  per (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);  } }>
    Python
    import heapq # iPair ==>Parell d'enters iPair = tupla # Aquesta classe representa un gràfic dirigit utilitzant # classe de representació de llista d'adjacència Gràfic: def __init__(self, V: int): # Constructor self.V = V self.adj = [[] per a _ en rang(V )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u, w)) # Imprimeix els camins més curts des de src a tots els altres vèrtexs def shortestPath(self, src: int): # Creeu una cua de prioritats per emmagatzemar els vèrtexs que # s'estan processant prèviament pq = [] heapq.heappush(pq, (0, src)) # Creeu un vector per a distàncies i inicialitzeu totes les # distàncies com a infinit (INF) dist = [float('inf')] * self.V dist[src] = 0 mentre pq: # El primer vèrtex del parell és la distància mínima # vèrtex, extreu-lo de la cua de prioritats. # L'etiqueta del vèrtex s'emmagatzema al segon del parell d, u = heapq.heappop(pq) # 'i' s'utilitza per obtenir tots els vèrtexs adjacents d'un # vèrtex per a v, pes en self.adj[u]: # Si hi ha un camí curt a v a través de u. if dist[v]> dist[u] + weight: # Actualització de la distància de v dist[v] = dist[u] + pes heapq.heappush(pq, (dist[v], v)) # Imprimeix les distàncies més curtes emmagatzemades a dist[] per i en rang(self.V): print(f'{i} 		 {dist[i]}') # Codi del controlador si __name__ == '__main__': # creeu el gràfic que es mostra a la figura anterior V = 9 g = Graph(V) # fent el gràfic mostrat a dalt 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#[V];  per (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 });  } // Imprimeix els camins més curts des de src a tots els altres vèrtexs public void ShortestPath(int src) { // Crea una cua de prioritats per emmagatzemar els vèrtexs que // s'estan preprocessant.  Conjunt ordenat pq = nou SortedSet (nou DistanceComparer());  // Creeu una matriu per a les distàncies i inicialitzeu totes les // distàncies com a infinites (INF) int[] dist = new int[V];  per (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) { // El primer vèrtex de la parella és la distància mínima // vèrtex, extreu-lo de la cua de prioritats.  // L'etiqueta de vèrtex s'emmagatzema en segon de parell (s'ha de fer // d'aquesta manera per mantenir els vèrtexs // ordenats per distància) int[] minDistVertex = pq.Min;  pq.Remove(minDistVertex);  int u = minDistVertex[1];  // 'i' s'utilitza per obtenir tots els vèrtexs adjacents d'un // vèrtex foreach (int[] adjVertex en this.adj[u]) { // Obteniu l'etiqueta del vèrtex i el pes del // actual adjacent a u.  int v = adjVertex[0];  int pes = adjVertex[1];  // Si hi ha un camí més curt cap a v passant per u.  if (dist[v]> dist[u] + pes) { // Actualització de la distància de v dist[v] = dist[u] + pes;  pq.Add(new int[] { dist[v], v });  } } } // Imprimeix les distàncies més curtes emmagatzemades a dist[] Console.WriteLine('Vertex Distance from Source');  per (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];  } retorn x[0] - y[0];  } } } Public class Program { // Codi del controlador public static void Main() { // crea el gràfic donat a la figura anterior int V = 9;  Gràfic g = nou Gràfic(V);  // fent el gràfic mostrat a dalt 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);  } } // aquest codi és aportat per 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) { // El primer vèrtex de la parella és la distància mínima // vèrtex, extreu-lo de la cua de prioritats.  // L'etiqueta del vèrtex s'emmagatzema en segon de parell (s'ha de fer // d'aquesta manera per mantenir la distància ordenada // dels vèrtexs (la distància ha de ser el primer ítem // en parella) let u = pq[0][1]; pq.shift(); // 'i' s'utilitza per obtenir tots els vèrtexs adjacents d'un // vèrtex for(let 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] + pes) { // Actualització de la distància de v dist[v] = dist[u] + pes;  pq.push([dist[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) retorna a[1] - b[1]; retorna a[0] - b[0]; });  } } } // Imprimeix les distàncies més curtes emmagatzemades a dist[] console.log('Distància del vèrtex des de la font');  per (sigui 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.>

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

    Complexitat temporal: O(E * logV), on E és el nombre d'arestes i V és el nombre de vèrtexs.
    Espai auxiliar: O(V)

    Aplicacions de l'algoritme de Dijkstra:

    • Google Maps utilitza l'algorisme Dijkstra per mostrar la distància més curta entre la font i la destinació.
    • En xarxes d'ordinadors , l'algoritme de Dijkstra constitueix la base per a diversos protocols d'encaminament, com ara OSPF (Open Shortest Path First) i IS-IS (Intermediate System to Intermediate System).
    • Els sistemes de gestió de transport i trànsit utilitzen l'algoritme de Dijkstra per optimitzar el flux de trànsit, minimitzar la congestió i planificar les rutes més eficients per als vehicles.
    • Les companyies aèries utilitzen l'algoritme de Dijkstra per planificar rutes de vol que minimitzin el consum de combustible i redueixin el temps de viatge.
    • L'algoritme de Dijkstra s'aplica a l'automatització del disseny electrònic per encaminar connexions en circuits integrats i xips d'integració a molt gran escala (VLSI).

    Per a una explicació més detallada, consulteu aquest article L'algoritme del camí més curt de Dijkstra utilitza priority_queue de STL .