logo

Come trovare i percorsi più brevi dalla sorgente a tutti i vertici utilizzando l'algoritmo di Dijkstra

Dato un grafico pesato e un vertice sorgente nel grafico, trova il percorsi più brevi dalla sorgente a tutti gli altri vertici nel grafico dato.

Nota: Il grafico dato non contiene alcun fronte negativo.

Esempi:



Ingresso: src = 0, il grafico è mostrato sotto.

1-(2)

Produzione: 0 4 12 19 21 11 9 8 14
Spiegazione: La distanza da 0 a 1 = 4.
La distanza minima da 0 a 2 = 12. 0->1->2
La distanza minima da 0 a 3 = 19. 0->1->2->3
La distanza minima da 0 a 4 = 21. 0->7->6->5->4
La distanza minima da 0 a 5 = 11.0->7->6->5
La distanza minima da 0 a 6 = 9. 0->7->6
La distanza minima da 0 a 7 = 8. 0->7
La distanza minima da 0 a 8 = 14. 0->1->2->8

dattiloscritto per ogni ciclo
Pratica consigliata per l'implementazione dell'algoritmo Dijkstra Provalo!

Utilizzando l'algoritmo di Dijkstra Matrice di adiacenza :

L'idea è quella di generare un file SPT (albero del percorso più breve) con una determinata fonte come radice. Mantenere una matrice di adiacenza con due insiemi,

  • un insieme contiene i vertici inclusi nell'albero dei cammini più brevi,
  • l'altro insieme include vertici non ancora inclusi nell'albero dei cammini più brevi.

Ad ogni passo dell'algoritmo, trova un vertice che si trova nell'altro insieme (insieme non ancora incluso) e ha una distanza minima dalla sorgente.

Algoritmo :

  • Crea un set sptSet (set di alberi dei cammini più brevi) che tiene traccia dei vertici inclusi nell'albero dei cammini più brevi, cioè la cui distanza minima dalla sorgente viene calcolata e finalizzata. Inizialmente, questo set è vuoto.
  • Assegnare un valore di distanza a tutti i vertici nel grafico di input. Inizializza tutti i valori di distanza come INFINITO . Assegnare il valore della distanza come 0 per il vertice di origine in modo che venga selezionato per primo.
  • Mentre sptSet non include tutti i vertici
    • Scegli un vertice In quello non c'è sptSet e ha un valore di distanza minima.
    • Includerti a sptSet .
    • Quindi aggiorna il valore della distanza di tutti i vertici adiacenti di In .
      • Per aggiornare i valori della distanza, scorrere tutti i vertici adiacenti.
      • Per ogni vertice adiacente In, se la somma del valore della distanza di In (dalla fonte) e peso del bordo u-v , è inferiore al valore della distanza di In , quindi aggiornare il valore della distanza di In .

Nota: Usiamo un array booleano sptSet[] per rappresentare l'insieme dei vertici inclusi in SPT . Se un valore sptSet[v] è vero, allora il vertice v è incluso in SPT , altrimenti no. Vettore dist[] viene utilizzato per memorizzare i valori della distanza più breve di tutti i vertici.

database delle proprietà degli acidi

Illustrazione dell'algoritmo Dijkstra :

Per comprendere l'algoritmo di Dijkstra, prendiamo un grafico e troviamo il percorso più breve dalla sorgente a tutti i nodi.

Considera il grafico seguente e origine = 0

1-(2)

Passo 1:

  • Il set sptSet è inizialmente vuoto e le distanze assegnate ai vertici sono {0, INF, INF, INF, INF, INF, INF, INF} dove INF indica infinito.
  • Ora scegli il vertice con un valore di distanza minimo. Il vertice 0 viene selezionato, includilo sptSet . COSÌ sptSet diventa {0}. Dopo aver incluso da 0 a sptSet , aggiorna i valori della distanza dei suoi vertici adiacenti.
  • I vertici adiacenti di 0 sono 1 e 7. I valori di distanza di 1 e 7 vengono aggiornati come 4 e 8.

Il sottografo seguente mostra i vertici e i relativi valori di distanza, vengono mostrati solo i vertici con valori di distanza finiti. I vertici inclusi in SPT sono mostrati in verde colore.

6


Passo 2:

stringa di int
  • Scegli il vertice con il valore di distanza minimo e non già incluso SPT (Non in sptSET ). Il vertice 1 viene selezionato e aggiunto sptSet .
  • COSÌ sptSet ora diventa {0, 1}. Aggiorna i valori della distanza dei vertici adiacenti di 1.
  • Il valore della distanza del vertice 2 diventa 12 .
    4


Passaggio 3:

  • Scegli il vertice con il valore di distanza minimo e non già incluso SPT (Non in sptSET ). Viene selezionato il vertice 7. COSÌ sptSet ora diventa {0, 1, 7}.
  • Aggiorna i valori della distanza dei vertici adiacenti di 7. Il valore della distanza dei vertici 6 e 8 diventa finito ( 15 e 9 rispettivamente).
    5


Passaggio 4:

  • Scegli il vertice con il valore di distanza minimo e non già incluso SPT (Non in sptSET ). Viene selezionato il vertice 6. COSÌ sptSet ora diventa {0, 1, 7, 6} .
  • Aggiorna i valori della distanza dei vertici adiacenti di 6. Il valore della distanza dei vertici 5 e 8 viene aggiornato.
    3-(1)


Ripetiamo i passaggi precedenti fino a sptSet include tutti i vertici del grafo dato. Infine, otteniamo il seguente S Albero del percorso più breve (SPT).

2-(2)

Di seguito è riportata l’implementazione dell’approccio di cui sopra:

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; }>
Giava
// 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>
Pitone
# 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 e sptSet[y] == False e  dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Codice del driver if __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) # Questo codice è fornito da Divyanshu Mehta e aggiornato da 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>

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

Complessità temporale: O(V2)
Spazio ausiliario: O(V)

ridhima tiwari

Appunti:

  • Il codice calcola la distanza più breve ma non calcola le informazioni sul percorso. Crea un array genitore, aggiorna l'array genitore quando viene aggiornata la distanza e usalo per mostrare il percorso più breve dalla sorgente a diversi vertici.
  • Il tempo è la complessità dell'implementazione O(V 2 ) . Se l'input il grafico è rappresentato utilizzando la lista di adiacenza , può essere ridotto a O(E * log V) con l'aiuto di un heap binario. Perfavore guarda Algoritmo di Dijkstra per la rappresentazione della lista di adiacenze per ulteriori dettagli.
  • L’algoritmo di Dijkstra non funziona per grafici con cicli di peso negativi.

Perché gli algoritmi di Dijkstra falliscono per i grafici con bordi negativi?

Il problema con i pesi negativi nasce dal fatto che l’algoritmo di Dijkstra presuppone che una volta aggiunto un nodo all’insieme dei nodi visitati, la sua distanza sia finalizzata e non cambierà. Tuttavia, in presenza di pesi negativi, questa ipotesi può portare a risultati errati.

Consideriamo come esempio il seguente grafico:

q3 mesi
Guasto di Dijkstra in caso di fronti negativi

Nel grafico sopra, A è il nodo sorgente, tra gli spigoli UN A B E UN A C , UN A B è il peso minore e Dijkstra assegna la distanza più breve B come 2, ma a causa dell'esistenza di un fronte negativo da C A B , la distanza più breve effettiva si riduce a 1 e Dijkstra non riesce a rilevarla.

Nota: Noi usiamo Algoritmo del percorso più breve di Bellman Ford nel caso in cui abbiamo bordi negativi nel grafico.

Utilizzando l'algoritmo di Dijkstra Elenco delle adiacenze in O(E logV):

Per l’algoritmo di Dijkstra, si consiglia sempre di utilizzare Ogni volta che la distanza di un vertice viene ridotta, aggiungiamo un'altra istanza di vertice in priorità_coda. Anche se sono presenti più istanze, consideriamo solo l'istanza con la distanza minima e ignoriamo le altre istanze.

  • La complessità temporale rimane O(E * LogV) poiché ci saranno al massimo O(E) vertici nella coda con priorità e O(logE) è uguale a O(logV)
  • Di seguito è riportata l’implementazione dell’approccio di cui sopra:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Coppia di numeri interi typedef coppia iPair; // Questa classe rappresenta un grafo diretto utilizzando // la rappresentazione della lista di adiacenza class Graph { int V; // Numero di vertici // In un grafico pesato, dobbiamo memorizzare il vertice // e la coppia di pesi per ogni lista di archi>* agg; pubblico: Graph(int V); // Costruttore // funzione per aggiungere un bordo al grafico void addEdge(int u, int v, int w);  // stampa il percorso più breve da s void shortestPath(int s); }; // Alloca memoria per la lista di adiacenze Graph::Graph(int V) { this->V = V;  agg = nuova 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)); } // Stampa i percorsi più brevi da src a tutti gli altri vertici void Graph::shortestPath(int src) { // Crea una coda con priorità per memorizzare i vertici che // vengono preelaborati. Questa è una sintassi strana in C++.  // Fare riferimento al collegamento seguente per i dettagli di questa sintassi // https://www.techcodeview.com priorità_queue , maggiore > pq;  // Crea un vettore per le distanze e inizializza tutte // le distanze come vettore infinito (INF). dist(V,INF);  // Inserisci la sorgente stessa nella coda di priorità e inizializza // la sua distanza come 0. pq.push(make_pair(0, src));  dist[origine] = 0;  /* Ciclo finché la coda con priorità non diventa vuota (o tutte le distanze non sono finalizzate) */ while (!pq.empty()) { // Il primo vertice della coppia è il vertice della distanza minima //, estrailo dalla coda con priorità.  // l'etichetta del vertice è memorizzata nel secondo della coppia (deve // ​​essere fatto in questo modo per mantenere la distanza // ordinata dei vertici (la distanza deve essere il primo elemento // della coppia) int u = pq.top().second; pq.pop(); // 'i' viene utilizzato per ottenere tutti i vertici adiacenti di una // lista di vertici>::iteratore i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Ottieni l'etichetta del vertice e il peso della corrente // adiacente a u.  int v = (*i).primo;  int peso = (*i).secondo;  // Se c'è un percorso in cortocircuito da v attraverso u.  if (dist[v]> dist[u] + peso) { // Aggiornamento della distanza di v dist[v] = dist[u] + peso;  pq.push(make_pair(dist[v], v));  } } } // Stampa le distanze più brevi memorizzate in dist[] printf('Vertex Distance from Source
    ');  for (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; }>
    Giava
    import java.util.*; class Graph {  private int V;  private List> agg;  Grafico(int V) { this.V = V;  adj = nuovo ArrayList();  for (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 = nuovo int[V];  Arrays.fill(dist, Integer.MAX_VALUE);  pq.add(nuovo iPair(0, src));  dist[origine] = 0;  while (!pq.isEmpty()) { int u = pq.poll().second;  for (iPair v : adj.get(u)) { if (dist[v.primo]> dist[u] + v.secondo) { dist[v.primo] = dist[u] + v.secondo;  pq.add(new iPair(dist[v.first], v.first));  } } } System.out.println('Distanza del vertice dalla sorgente');  for (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);  } }>
    Pitone
    import heapq # iPair ==>Coppia intera iPair = tuple # Questa classe rappresenta un grafo diretto utilizzando # la classe di rappresentazione della lista di adiacenza Graph: def __init__(self, V: int): # Costruttore 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)) # Stampa i percorsi più brevi da src a tutti gli altri vertici def shortestPath(self, src: int): # Crea una coda con priorità per memorizzare i vertici che # vengono preelaborati pq = [] heapq.heappush(pq, (0, src)) # Crea un vettore per le distanze e inizializza tutte le # distanze come infinite (INF) dist = [float('inf')] * self.V dist[src] = 0 while pq: # Il primo vertice della coppia è la distanza minima # vertice, estrailo dalla coda con priorità. # l'etichetta del vertice è memorizzata nel secondo della coppia d, u = heapq.heappop(pq) # 'i' viene utilizzata per ottenere tutti i vertici adiacenti di un # vertice per v, peso in self.adj[u]: # If c'è un percorso in cortocircuito verso v attraverso u. if dist[v]> dist[u] + peso: # Aggiornamento della distanza di v dist[v] = dist[u] + peso heapq.heappush(pq, (dist[v], v)) # Stampa le distanze più brevi memorizzate in dist[] for i in range(self.V): print(f'{i} 		 {dist[i]}') # Codice del driver if __name__ == '__main__': # crea il grafico mostrato nella figura sopra V = 9 g = Graph(V) # crea il grafico mostrato sopra 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 [] agg;  public Graph(int V) { // Numero di vertici this.V = V;  // In un grafico pesato, dobbiamo memorizzare il vertice // e la coppia di pesi per ogni bordo this.adj = new List [V];  for (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 });  } // Stampa i percorsi più brevi da src a tutti gli altri vertici public void ShortestPath(int src) { // Crea una coda con priorità per memorizzare i vertici che // vengono preelaborati.  Insieme ordinato pq = nuovo insieme ordinato (nuovo DistanceComparer());  // Crea un array per le distanze e inizializza tutte // le distanze come infinite (INF) int[] dist = new int[V];  for (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) { // Il primo vertice della coppia è la distanza minima // vertice, estrailo dalla coda di priorità.  // l'etichetta del vertice è memorizzata nel secondo della coppia (deve // ​​essere fatto in questo modo per mantenere i vertici // ordinati per distanza) int[] minDistVertex = pq.Min;  pq.Rimuovi(minDistVertex);  int u = minDistVertice[1];  // 'i' viene utilizzato per ottenere tutti i vertici adiacenti di un // vertice foreach (int[] adjVertex in this.adj[u]) { // Ottieni l'etichetta del vertice e il peso della corrente // adiacente di u.  int v = adjVertice[0];  int peso = adjVertice[1];  // Se c'è un percorso più breve da v attraverso u.  if (dist[v]> dist[u] + peso) { // Aggiornamento della distanza di v dist[v] = dist[u] + peso;  pq.Add(new int[] { dist[v], v });  } } } // Stampa le distanze più brevi memorizzate in dist[] Console.WriteLine('Vertex Distance from Source');  for (int i = 0; i< V; ++i)  Console.WriteLine(i + '	' + dist[i]);  }  private class DistanceComparer : IComparer { public int Confronta(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1];  } restituisce x[0] - y[0];  } } } public class Program { // Codice driver public static void Main() { // crea il grafico indicato nella figura sopra int V = 9;  Grafico g = nuovo Grafico(V);  // realizza il grafico sopra mostrato g.AddEdge(0, 1, 4);  g.AddEdge(0, 7, 8);  g.AddEdge(1, 2, 8);  g.AggiungiBordo(1, 7, 11);  g.AggiungiBordo(2, 3, 7);  g.AggiungiBordo(2, 8, 2);  g.AggiungiBordo(2, 5, 4);  g.AggiungiBordo(3, 4, 9);  g.AggiungiBordo(3, 5, 14);  g.AggiungiBordo(4, 5, 10);  g.AggiungiBordo(5, 6, 2);  g.AggiungiBordo(6, 7, 1);  g.AggiungiBordo(6, 8, 6);  g.AggiungiBordo(7, 8, 7);  g.PercorsoPiùBreve(0);  } } // questo codice è un contributo di 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) { // Il primo vertice della coppia è la distanza minima // vertice, estrailo dalla coda di priorità.  // l'etichetta del vertice è memorizzata nel secondo della coppia (deve // ​​essere fatto in questo modo per mantenere la distanza // ordinata dei vertici (la distanza deve essere il primo elemento // della coppia) let u = pq[0][1]; pq.shift(); // 'i' viene utilizzato per ottenere tutti i vertici adiacenti di un // vertice 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] + peso) { // Aggiornamento della distanza di v dist[v] = dist[u] + peso;  pq.push([dist[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; });  } } } // Stampa le distanze più brevi memorizzate in dist[] console.log('Vertex Distance from Source');  per (sia 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.>

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

    Complessità temporale: O(E * logV), dove E è il numero di spigoli e V è il numero di vertici.
    Spazio ausiliario: O(V)

    Applicazioni dell’algoritmo di Dijkstra:

    • Google Maps utilizza l'algoritmo Dijkstra per mostrare la distanza più breve tra origine e destinazione.
    • In reti di computer , l’algoritmo di Dijkstra costituisce la base per vari protocolli di routing, come OSPF (Open Shortest Path First) e IS-IS (Intermediate System to Intermediate System).
    • I sistemi di gestione dei trasporti e del traffico utilizzano l’algoritmo di Dijkstra per ottimizzare il flusso del traffico, ridurre al minimo la congestione e pianificare i percorsi più efficienti per i veicoli.
    • Le compagnie aeree utilizzano l'algoritmo di Dijkstra per pianificare rotte di volo che riducono al minimo il consumo di carburante e riducono i tempi di viaggio.
    • L’algoritmo di Dijkstra viene applicato nell’automazione della progettazione elettronica per instradare connessioni su circuiti integrati e chip di integrazione su larga scala (VLSI).

    Per una spiegazione più dettagliata fare riferimento a questo articolo Algoritmo del percorso più breve di Dijkstra che utilizza la priorità_queue di STL .