logo

Cum să găsiți cele mai scurte căi de la sursă la toate nodurile folosind algoritmul Dijkstra

Având în vedere un grafic ponderat și un vârf sursă în grafic, găsiți cele mai scurte căi de la sursă la toate celelalte vârfuri din graficul dat.

Notă: Graficul dat nu conține nicio muchie negativă.

Exemple:



Intrare: src = 0, graficul este prezentat mai jos.

1-(2)

Ieșire: 0 4 12 19 21 11 9 8 14
Explicaţie: Distanța de la 0 la 1 = 4.
Distanța minimă de la 0 la 2 = 12. 0->1->2
Distanța minimă de la 0 la 3 = 19. 0->1->2->3
Distanța minimă de la 0 la 4 = 21. 0->7->6->5->4
Distanța minimă de la 0 la 5 = 11. 0->7->6->5
Distanța minimă de la 0 la 6 = 9. 0->7->6
Distanța minimă de la 0 la 7 = 8. 0->7
Distanța minimă de la 0 la 8 = 14. 0->1->2->8

șir separat în java
Practică recomandată Implementarea algoritmului Dijkstra Încercați!

Algoritmul lui Dijkstra folosind Matricea adiacentei :

Ideea este de a genera un SPT (arborele cu cea mai scurtă cale) cu o sursă dată ca rădăcină. Menține o matrice de adiacență cu două seturi,

  • un set conține vârfuri incluse în arborele cu calea cea mai scurtă,
  • alt set include vârfuri care nu sunt încă incluse în arborele cu calea cea mai scurtă.

La fiecare pas al algoritmului, găsiți un vârf care se află în celălalt set (setul nu este încă inclus) și are o distanță minimă față de sursă.

Algoritm :

  • Creați un set sptSet (cel mai scurt set de arbore de cale) care ține evidența vârfurilor incluse în arborele de cea mai scurtă cale, adică a cărui distanță minimă de la sursă este calculată și finalizată. Inițial, acest set este gol.
  • Atribuiți o valoare de distanță tuturor nodurilor din graficul de intrare. Inițializați toate valorile distanței ca INFINIT . Atribuiți valoarea distanței ca 0 pentru vârful sursă, astfel încât acesta să fie ales primul.
  • In timp ce sptSet nu include toate nodurile
    • Alegeți un vârf în asta nu este acolo in sptSet și are o valoare minimă a distanței.
    • Includeți-vă la sptSet .
    • Apoi actualizați valoarea distanței tuturor vârfurilor adiacente ale în .
      • Pentru a actualiza valorile distanței, iterați prin toate vârfurile adiacente.
      • Pentru fiecare vârf adiacent în, dacă suma valorii distanței a în (de la sursă) și greutatea muchiei u-v , este mai mică decât valoarea distanței a în , apoi actualizați valoarea distanței de în .

Notă: Folosim un tablou boolean sptSet[] pentru a reprezenta setul de vârfuri incluse în SPT . Dacă o valoare sptSet[v] este adevărat, atunci vârful v este inclus în SPT , altfel nu. Matrice dist[] este folosit pentru a stoca cele mai scurte valori ale distanței dintre toate vârfurile.

Ilustrație a algoritmului Dijkstra :

Pentru a înțelege algoritmul lui Dijkstra, să luăm un grafic și să găsim cea mai scurtă cale de la sursă la toate nodurile.

aleatoriu în c

Luați în considerare graficul de mai jos și src = 0

1-(2)

Pasul 1:

  • Decorul sptSet este inițial gol și distanțele atribuite vârfurilor sunt {0, INF, INF, INF, INF, INF, INF, INF} unde INF indică infinit.
  • Acum alegeți vârful cu o valoare minimă a distanței. Vârful 0 este ales, includeți-l în sptSet . Asa de sptSet devine {0}. După ce a inclus 0 la sptSet , actualizați valorile distanței ale vârfurilor adiacente.
  • Vârfurile adiacente ale lui 0 sunt 1 și 7. Valorile distanței de 1 și 7 sunt actualizate ca 4 și 8.

Următorul subgraf arată vârfurile și valorile distanței acestora, fiind afișate doar vârfurile cu valori ale distanței finite. Vârfurile incluse în SPT sunt prezentate în verde culoare.

6


Pasul 2:

  • Alegeți vârful cu valoarea distanței minime și care nu este deja inclus SPT (nu în sptSET ). Vârful 1 este ales și adăugat la sptSet .
  • Asa de sptSet acum devine {0, 1}. Actualizați valorile distanței ale vârfurilor adiacente de 1.
  • Valoarea distanței a vârfului 2 devine 12 .
    4


Pasul 3:

  • Alegeți vârful cu valoarea distanței minime și care nu este deja inclus SPT (nu în sptSET ). Vârful 7 este ales. Asa de sptSet acum devine {0, 1, 7}.
  • Actualizați valorile distanței ale vârfurilor adiacente ale lui 7. Valoarea distanței a vârfurilor 6 și 8 devine finită ( 15 și 9 respectiv).
    5


Pasul 4:

  • Alegeți vârful cu valoarea distanței minime și care nu este deja inclus SPT (nu în sptSET ). Vârful 6 este ales. Asa de sptSet acum devine {0, 1, 7, 6} .
  • Actualizați valorile distanței ale vârfurilor adiacente 6. Valoarea distanței vârfurilor 5 și 8 este actualizată.
    3-(1)


Repetăm ​​pașii de mai sus până când sptSet include toate vârfurile graficului dat. În cele din urmă, obținem următorul S Hortest Path Tree (SPT).

2-(2)

Mai jos este implementarea abordării de mai sus:

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>
Piton
# 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) # Codul driverului dacă __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) # Acest cod este contribuit de Divyanshu Mehta și actualizat de 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>

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

Complexitatea timpului: O(V2)
Spațiu auxiliar: O(V)

Note:

  • Codul calculează cea mai scurtă distanță, dar nu calculează informațiile despre cale. Creați o matrice părinte, actualizați matricea părinte când distanța este actualizată și utilizați-o pentru a afișa cea mai scurtă cale de la sursă la diferite vârfuri.
  • Timpul Complexitatea implementării este O(V 2 ) . Dacă intrarea graficul este reprezentat folosind lista de adiacente , poate fi redus la O(E * log V) cu ajutorul unui heap binar. Te rog vezi Algoritmul lui Dijkstra pentru reprezentarea listei de adiacență pentru mai multe detalii.
  • Algoritmul lui Dijkstra nu funcționează pentru graficele cu cicluri de greutate negative.

De ce algoritmii lui Dijkstra eșuează pentru graficele cu margini negative?

Problema cu ponderile negative apare din faptul că algoritmul lui Dijkstra presupune că odată ce un nod este adăugat la setul de noduri vizitate, distanța acestuia este finalizată și nu se va modifica. Cu toate acestea, în prezența ponderilor negative, această presupunere poate duce la rezultate incorecte.

Luați în considerare următorul grafic pentru exemplu:

Eșecul-Dijkstra-în-cazul-muchiilor-negative

În graficul de mai sus, A este nodul sursă, printre muchii A la B și A la C , A la B este greutatea mai mică și Dijkstra atribuie cea mai scurtă distanță de B ca 2, dar din cauza existenței unei margini negative din C la B , cea mai scurtă distanță reală se reduce la 1 pe care Dijkstra nu o detectează.

Notă: Folosim Algoritmul lui Bellman Ford pe calea cea mai scurtă în cazul în care avem muchii negative în grafic.

Algoritmul lui Dijkstra folosind Lista adiacentei în O(E logV):

Pentru algoritmul lui Dijkstra, este întotdeauna recomandat să îl utilizați Ori de câte ori distanța unui vârf este redusă, adăugăm încă o instanță a unui vârf în priority_queue. Chiar dacă există mai multe instanțe, luăm în considerare doar instanța cu distanță minimă și ignorăm alte instanțe.

  • Complexitatea timpului rămâne O(E * LogV) deoarece vor exista cel mult O(E) vârfuri în coada de prioritate și O(logE) este același cu O(logV)
  • Mai jos este implementarea abordării de mai sus:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Integer Pair typedef pereche iPair; // Această clasă reprezintă un graf direcționat folosind // clasa de reprezentare a listei de adiacență Graph { int V; // Nr. de vârfuri // Într-un grafic ponderat, trebuie să stocăm vârful // și perechea de ponderi pentru fiecare listă de margini>> adj; public: Graph(int V); // Constructor // funcție pentru a adăuga o margine la grafic void addEdge(int u, int v, int w);  // afișează cea mai scurtă cale de la s void shortestPath(int s); }; // Aloca memorie pentru lista de adiacente Graph::Graph(int V) { this->V = V;  adj = listă nouă [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)); } // Imprimă cele mai scurte căi de la src la toate celelalte vârfuri void Graph::shortestPath(int src) { // Creați o coadă de prioritate pentru a stoca nodurile care // sunt preprocesate. Aceasta este sintaxă ciudată în C++.  // Consultați linkul de mai jos pentru detalii despre această sintaxă // https://www.techcodeview.com priority_queue , mai mare > pq;  // Creați un vector pentru distanțe și inițializați // toate distanțele ca vector infinit (INF). dist(V, INF);  // Inserează sursa însăși în coada de prioritate și inițializează // distanța acesteia ca 0. pq.push(make_pair(0, src));  dist[src] = 0;  /* Se face buclă până când coada de prioritate devine goală (sau toate distanțele nu sunt finalizate) */ while (!pq.empty()) { // Primul vârf din pereche este distanța minimă // vârf, extrageți-l din coada de prioritate.  // eticheta nodurilor este stocată în secunda din pereche (trebuie făcută astfel pentru a păstra vârfurile // distanța sortată (distanța trebuie să fie primul element // în pereche) int u = pq.top().second; pq.pop(); // 'i' este folosit pentru a obține toate nodurile adiacente ale unei // liste de vârfuri>::iteratorul i;  pentru (i = adj[u].begin(); i != adj[u].end(); ++i) { // Obține eticheta vârfului și greutatea curentului // adiacent lui u.  int v = (*i).în primul rând;  int greutate = (*i).secunda;  // Dacă există cale scurtă către v prin u.  if (dist[v]> dist[u] + greutate) { // Actualizarea distanței de v dist[v] = dist[u] + greutate;  pq.push(make_pair(dist[v], v));  } } } // Afișează cele mai scurte distanțe stocate în dist[] printf('Distanța la vârf de la sursă
    ');  pentru (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();  pentru (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 = new int[V];  Arrays.fill(dist, Integer.MAX_VALUE);  pq.add(new iPair(0, src));  dist[src] = 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(new iPair(dist[v.first], v.first));  } } } System.out.println('Distanța la vârf de la sursă');  pentru (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);  } }>
    Piton
    import heapq # iPair ==>Integer Pair iPair = tuplu # Această clasă reprezintă un grafic direcționat folosind # clasa de reprezentare a listei de adiacență Graph: def __init__(self, V: int): # Constructor self.V = V self.adj = [[] for _ in range(V )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u, w)) # Imprimă cele mai scurte căi de la src la toate celelalte vârfuri def shortestPath(self, src: int): # Creați o coadă de prioritate pentru a stoca nodurile care # sunt preprocesate pq = [] heapq.heappush(pq, (0, src)) # Creați un vector pentru distanțe și inițializați toate # distanțe ca infinit (INF) dist = [float('inf')] * self.V dist[src] = 0 în timp ce pq: # Primul vârf din pereche este distanța minimă # vertex, extrageți-l din coada de prioritate. # eticheta nodurilor este stocată în secunda perechii d, u = heapq.heappop(pq) # 'i' este folosit pentru a obține toate vârfurile adiacente ale unui # vârf pentru v, greutate în self.adj[u]: # Dacă există cale scurtă către v prin u. dacă dist[v]> dist[u] + greutate: # Actualizarea distanței de v dist[v] = dist[u] + greutate heapq.heappush(pq, (dist[v], v)) # Afișați cele mai scurte distanțe stocate în dist[] for i in range(self.V): print(f'{i} 		 {dist[i]}') # Codul driverului if __name__ == '__main__': # creați graficul din figura de mai sus V = 9 g = Graph(V) # realizând graficul prezentat mai sus 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# dist[u] + greutate) { // Actualizarea distanței de v dist[v] = dist[u] + greutate;  pq.Add(new int[] { dist[v], v });  } } } // Imprimă cele mai scurte distanțe stocate în dist[] Console.WriteLine('Distanța Vertex de la Sursă');  pentru (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];  } returnează x[0] - y[0];  } } } public class Program { // Cod driver public static void Main() { // creează graficul dat în figura de mai sus int V = 9;  Graficul g = nou Grafic(V);  // realizarea graficului prezentat mai sus 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);  } } // acest cod este contribuit de 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) { // Primul vârf din pereche este distanța minimă // vârf, extrageți-l din coada de prioritate.  // eticheta nodurilor este stocată în secunda de pereche (trebuie făcută astfel pentru a păstra vârfurile // distanța sortată (distanța trebuie să fie primul element // în pereche) let u = pq[0][1]; pq.shift(); // 'i' este folosit pentru a obține toate nodurile adiacente ale unui // vârf pentru (fie 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] + greutate) { // Actualizarea distanței de v dist[v] = dist[u] + greutate;  pq.push([dist[v], v]);  pq.sort((a, b) =>{ dacă(a[0] == b[0]) returnează a[1] - b[1]; returnează a[0] - b[0]; });  } } } // Afișează cele mai scurte distanțe stocate în dist[] console.log('Distanța la vârf de la sursă');  pentru (fie 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.>

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

    Complexitatea timpului: O(E * logV), unde E este numărul de muchii și V este numărul de vârfuri.
    Spațiu auxiliar: O(V)

    converti șirul în char

    Aplicații ale algoritmului lui Dijkstra:

    • Hărți Google folosește algoritmul Dijkstra pentru a afișa cea mai scurtă distanță dintre sursă și destinație.
    • În rețele de calculatoare , algoritmul lui Dijkstra formează baza pentru diferite protocoale de rutare, cum ar fi OSPF (Open Shortest Path First) și IS-IS (Intermediate System to Intermediate System).
    • Sistemele de transport și management al traficului folosesc algoritmul Dijkstra pentru a optimiza fluxul de trafic, a minimiza aglomerația și pentru a planifica cele mai eficiente rute pentru vehicule.
    • Companiile aeriene folosesc algoritmul Dijkstra pentru a planifica rute de zbor care reduc la minimum consumul de combustibil, reduc timpul de călătorie.
    • Algoritmul lui Dijkstra este aplicat în automatizarea designului electronic pentru rutarea conexiunilor pe circuite integrate și cipuri de integrare la scară foarte mare (VLSI).

    Pentru o explicație mai detaliată consultați acest articol Algoritmul lui Dijkstra cu cea mai scurtă cale folosind priority_queue din STL .