logo

Hvordan finne korteste veier fra kilde til alle hjørner ved hjelp av Dijkstras algoritme

Gitt en vektet graf og et kildepunkt i grafen, finn korteste veier fra kilden til alle de andre toppunktene i den gitte grafen.

Merk: Den gitte grafen inneholder ingen negativ kant.



Eksempler:

Inndata: src = 0, grafen er vist nedenfor.

1-(2)

Produksjon: 0 4 12 19 21 11 9 8 14
Forklaring: Avstanden fra 0 til 1 = 4.
Minste avstand fra 0 til 2 = 12. 0->1->2
Minste avstand fra 0 til 3 = 19. 0->1->2->3
Minimumsavstanden fra 0 til 4 = 21. 0->7->6->5->4
Minste avstand fra 0 til 5 = 11. 0->7->6->5
Minste avstand fra 0 til 6 = 9. 0->7->6
Minste avstand fra 0 til 7 = 8. 0->7
Minste avstand fra 0 til 8 = 14. 0->1->2->8



'prim's algoritme'
Anbefalt praksis for implementering av Dijkstra-algoritmen Prøv det!

Dijkstras algoritme ved hjelp av Adjacency Matrix :

Tanken er å generere en SPT (korteste vei-tre) med en gitt kilde som rot. Oppretthold en Adjacency Matrix med to sett,

  • ett sett inneholder toppunkter inkludert i treet med korteste vei,
  • annet sett inkluderer toppunkter som ennå ikke er inkludert i treet med korteste vei.

På hvert trinn i algoritmen, finn et toppunkt som er i det andre settet (sett som ennå ikke er inkludert) og har en minimumsavstand fra kilden.

Algoritme :



  • Lag et sett sptSet (korteste bane-tresett) som holder oversikt over toppunkter som er inkludert i det korteste banetreet, dvs. hvis minimumsavstand fra kilden beregnes og sluttføres. Til å begynne med er dette settet tomt.
  • Tilordne en avstandsverdi til alle toppunktene i inndatagrafen. Initialiser alle avstandsverdier som UENDELIG . Tilordne avstandsverdien som 0 for kildetoppunktet slik at det velges først.
  • Samtidig som sptSet inkluderer ikke alle hjørner
    • Velg et toppunkt i som ikke er der inne sptSet og har en minimumsavstandsverdi.
    • Inkluder deg til sptSet .
    • Deretter oppdaterer avstandsverdien for alle tilstøtende hjørner av i .
      • For å oppdatere avstandsverdiene, iterer gjennom alle tilstøtende hjørner.
      • For hvert tilstøtende toppunkt i, hvis summen av avstandsverdien av i (fra kilde) og vekt av kant u-v , er mindre enn avstandsverdien til i , og oppdater deretter avstandsverdien til i .

Merk: Vi bruker en boolsk matrise sptSet[] for å representere settet med toppunkter inkludert i SPT . Hvis en verdi sptSet[v] er sant, er toppunkt v inkludert i SPT , ellers ikke. Array dist[] brukes til å lagre de korteste avstandsverdiene for alle toppunktene.

slett filen i java

Illustrasjon av Dijkstra Algorithm :

For å forstå Dijkstras algoritme kan vi ta en graf og finne den korteste veien fra kilden til alle noder.

Vurder grafen nedenfor og src = 0

1-(2)

Trinn 1:

  • Settet sptSet er i utgangspunktet tom og avstander som er tilordnet toppunktene er {0, INF, INF, INF, INF, INF, INF, INF} hvor INF indikerer uendelig.
  • Velg nå toppunktet med en minimumsavstandsverdi. Toppunktet 0 er plukket, ta det med sptSet . Så sptSet blir {0}. Etter å ha inkludert 0 til sptSet , oppdater avstandsverdiene til de tilstøtende toppunktene.
  • Tilstøtende hjørner på 0 er 1 og 7. Avstandsverdiene på 1 og 7 oppdateres som 4 og 8.

Følgende undergraf viser toppunktene og deres avstandsverdier, kun toppunktene med endelige avstandsverdier vises. Toppene inkludert i SPT vises i grønn farge.

6


Steg 2:

maskinskriftsdato
  • Velg toppunktet med minimumsavstandsverdi og ikke allerede inkludert i SPT (ikke i sptSET ). Toppunktet 1 plukkes og legges til sptSet .
  • sptSet blir nå {0, 1}. Oppdater avstandsverdiene til tilstøtende toppunkter på 1.
  • Avstandsverdien til toppunkt 2 blir 12 .
    4


Trinn 3:

  • Velg toppunktet med minimumsavstandsverdi og ikke allerede inkludert i SPT (ikke i sptSET ). Vertex 7 er plukket. Så sptSet nå blir {0, 1, 7}.
  • Oppdater avstandsverdiene til tilstøtende toppunkter på 7. Avstandsverdien til toppunkt 6 og 8 blir endelig ( 15 og 9 henholdsvis).
    5


Trinn 4:

  • Velg toppunktet med minimumsavstandsverdi og ikke allerede inkludert i SPT (ikke i sptSET ). Vertex 6 er plukket. Så sptSet nå blir {0, 1, 7, 6} .
  • Oppdater avstandsverdiene til tilstøtende toppunkter på 6. Avstandsverdiene til toppunkt 5 og 8 oppdateres.
    3-(1)


Vi gjentar trinnene ovenfor til sptSet inkluderer alle toppunktene i den gitte grafen. Til slutt får vi følgende S hortest Path Tree (SPT).

2-(2)

Nedenfor er implementeringen av tilnærmingen ovenfor:

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 og sptSet[y] == False og  dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Driverkode hvis __navn__ == '__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) # Denne koden er bidratt av Divyanshu Mehta og oppdatert av Pranav Singh Sambyal>
C#
// C# program for Dijkstra's single // source shortest path algorithm. // The program is for adjacency matrix // representation of the graph using System; class GFG {  // A utility function to find the  // vertex with minimum distance  // value, from the set of vertices  // not yet included in shortest  // path tree  static int V = 9;  int minDistance(int[] dist, bool[] sptSet)  {  // Initialize min value  int min = int.MaxValue, min_index = -1;  for (int v = 0; v < V; v++)  if (sptSet[v] == false && dist[v] <= min) {  min = dist[v];  min_index = v;  }  return min_index;  }  // A utility function to print  // the constructed distance array  void printSolution(int[] dist)  {  Console.Write('Vertex 		 Distance '  + 'from Source
');  for (int i = 0; i < V; i++)  Console.Write(i + ' 		 ' + dist[i] + '
');  }  // Function that implements Dijkstra's  // single source shortest path algorithm  // for a graph represented using adjacency  // matrix representation  void dijkstra(int[, ] graph, int src)  {  int[] dist  = new int[V]; // The output array. dist[i]  // will hold the shortest  // distance from src to i  // sptSet[i] will true if vertex  // i is included in shortest path  // tree or shortest distance from  // src to i is finalized  bool[] sptSet = new bool[V];  // Initialize all distances as  // INFINITE and stpSet[] as false  for (int i = 0; i < V; i++) {  dist[i] = int.MaxValue;  sptSet[i] = false;  }  // Distance of source vertex  // from itself is always 0  dist[src] = 0;  // Find shortest path for all vertices  for (int count = 0; count < V - 1; count++) {  // Pick the minimum distance vertex  // from the set of vertices not yet  // processed. u is always equal to  // src in first iteration.  int u = minDistance(dist, sptSet);  // Mark the picked vertex as processed  sptSet[u] = true;  // Update dist value of the adjacent  // vertices of the picked vertex.  for (int v = 0; v < V; v++)  // Update dist[v] only if is not in  // sptSet, there is an edge from u  // to v, and total weight of path  // from src to v through u is smaller  // than current value of dist[v]  if (!sptSet[v] && graph[u, v] != 0  && dist[u] != int.MaxValue  && dist[u] + graph[u, v] < dist[v])  dist[v] = dist[u] + graph[u, v];  }  // print the constructed distance array  printSolution(dist);  }  // Driver's Code  public static void Main()  {  /* Let us create the example graph discussed above */  int[, ] graph  = new int[, ] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },  { 4, 0, 8, 0, 0, 0, 0, 11, 0 },  { 0, 8, 0, 7, 0, 4, 0, 0, 2 },  { 0, 0, 7, 0, 9, 14, 0, 0, 0 },  { 0, 0, 0, 9, 0, 10, 0, 0, 0 },  { 0, 0, 4, 14, 10, 0, 2, 0, 0 },  { 0, 0, 0, 0, 0, 2, 0, 1, 6 },  { 8, 11, 0, 0, 0, 0, 1, 0, 7 },  { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };  GFG t = new GFG();  // Function call  t.dijkstra(graph, 0);  } } // This code is contributed by ChitraNayal>
Javascript
// A Javascript program for Dijkstra's single  // source shortest path algorithm.  // The program is for adjacency matrix  // representation of the graph  let V = 9; // A utility function to find the  // vertex with minimum distance  // value, from the set of vertices  // not yet included in shortest  // path tree  function minDistance(dist,sptSet) {    // Initialize min value   let min = Number.MAX_VALUE;  let min_index = -1;    for(let v = 0; v < V; v++)  {  if (sptSet[v] == false && dist[v] <= min)   {  min = dist[v];  min_index = v;  }  }  return min_index; } // A utility function to print  // the constructed distance array  function printSolution(dist) {  console.log('Vertex 		 Distance from Source ');  for(let i = 0; i < V; i++)  {  console.log(i + ' 		 ' +   dist[i] + ' ');  } } // Function that implements Dijkstra's  // single source shortest path algorithm  // for a graph represented using adjacency  // matrix representation  function dijkstra(graph, src) {  let dist = new Array(V);  let sptSet = new Array(V);    // Initialize all distances as   // INFINITE and stpSet[] as false   for(let i = 0; i < V; i++)  {  dist[i] = Number.MAX_VALUE;  sptSet[i] = false;  }    // Distance of source vertex   // from itself is always 0   dist[src] = 0;    // Find shortest path for all vertices   for(let count = 0; count < V - 1; count++)  {    // Pick the minimum distance vertex   // from the set of vertices not yet   // processed. u is always equal to   // src in first iteration.   let u = minDistance(dist, sptSet);    // Mark the picked vertex as processed   sptSet[u] = true;    // Update dist value of the adjacent   // vertices of the picked vertex.   for(let v = 0; v < V; v++)  {    // Update dist[v] only if is not in   // sptSet, there is an edge from u   // to v, and total weight of path   // from src to v through u is smaller   // than current value of dist[v]   if (!sptSet[v] && graph[u][v] != 0 &&   dist[u] != Number.MAX_VALUE &&  dist[u] + graph[u][v] < dist[v])  {  dist[v] = dist[u] + graph[u][v];  }  }  }    // Print the constructed distance array  printSolution(dist); } // Driver code let graph = [ [ 0, 4, 0, 0, 0, 0, 0, 8, 0 ],  [ 4, 0, 8, 0, 0, 0, 0, 11, 0 ],  [ 0, 8, 0, 7, 0, 4, 0, 0, 2 ],  [ 0, 0, 7, 0, 9, 14, 0, 0, 0],  [ 0, 0, 0, 9, 0, 10, 0, 0, 0 ],  [ 0, 0, 4, 14, 10, 0, 2, 0, 0],  [ 0, 0, 0, 0, 0, 2, 0, 1, 6 ],  [ 8, 11, 0, 0, 0, 0, 1, 0, 7 ],  [ 0, 0, 2, 0, 0, 0, 6, 7, 0 ] ] dijkstra(graph, 0); // This code is contributed by rag2127>

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

Tidskompleksitet: O(V2)
Hjelpeplass: O(V)

hvordan å injisere mock abstrakt klasse

Merknader:

  • Koden beregner den korteste avstanden, men beregner ikke baneinformasjonen. Opprett en overordnet matrise, oppdater den overordnede matrisen når avstanden er oppdatert og bruk den til å vise den korteste veien fra kilden til forskjellige toppunkter.
  • Tiden Kompleksiteten til implementeringen er O(V 2 ) . Hvis inngangen grafen er representert ved hjelp av tilstøtende liste , kan den reduseres til O(E * log V) ved hjelp av en binær haug. Vær snill å se Dijkstras algoritme for representasjon av nabolister for flere detaljer.
  • Dijkstras algoritme fungerer ikke for grafer med negative vektsykluser.

Hvorfor mislykkes Dijkstras algoritmer for at grafene har negative kanter?

Problemet med negative vekter oppstår fra det faktum at Dijkstras algoritme antar at når en node er lagt til settet med besøkte noder, er avstanden ferdigstilt og vil ikke endres. Men i nærvær av negative vekter kan denne antagelsen føre til feil resultater.

Tenk på følgende graf for eksempelet:

streng sammenligne c#
Failure-of-Dijkstra-i-case-of-negative-edges

I grafen ovenfor er A kildenoden, blant kantene EN til B og EN til C , EN til B er den mindre vekten og Dijkstra tildeler den korteste avstanden til B som 2, men på grunn av eksistensen av en negativ kant fra C til B , reduseres den faktiske korteste avstanden til 1 som Dijkstra ikke klarer å oppdage.

Merk: Vi bruker Bellman Fords korteste vei-algoritme i tilfelle vi har negative kanter i grafen.

Dijkstras algoritme ved hjelp av Tilknytningsliste i O(E logV):

For Dijkstras algoritme anbefales det alltid å bruke Hver gang avstanden til et toppunkt reduseres, legger vi til en forekomst til av et toppunkt i priority_queue. Selv om det er flere forekomster, vurderer vi bare forekomsten med minimumsavstand og ignorerer andre forekomster.

  • Tidskompleksiteten gjenstår O(E * LogV) da det maksimalt vil være O(E)-punkt i prioritetskøen og O(logE) er det samme som O(logV)
  • Nedenfor er implementeringen av tilnærmingen ovenfor:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Heltallspar typedef-par iPair; // Denne klassen representerer en rettet graf som bruker // adjacency list representation class Graph { int V; // Antall toppunkter // I en vektet graf må vi lagre toppunkt // og vektpar for hver kantliste>* adj; offentlig: Graph(int V); // Konstruktør // funksjon for å legge til en kant til grafen void addEdge(int u, int v, int w);  // skriver ut korteste vei fra s void shortestPath(int s); }; // Tildeler minne for tilstøtende liste Graph::Graph(int V) { this->V = V;  adj = ny liste [V]; } void Graph::addEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w));  adj[v].push_back(make_pair(u, w)); } // Skriver ut korteste veier fra src til alle andre toppunkter void Graph::shortestPath(int src) { // Opprett en prioritetskø for å lagre toppunkter som // blir forhåndsbehandlet. Dette er merkelig syntaks i C++.  // Se lenken nedenfor for detaljer om denne syntaksen // https://www.techcodeview.com priority_queue , større > pq;  // Lag en vektor for avstander og initialiser alle // avstander som uendelig (INF) vektor dist(V, INF);  // Sett inn selve kilden i prioritetskøen og initialiser // dens avstand som 0. pq.push(make_pair(0, src));  dist[kilde] = 0;  /* Looping til prioritetskøen blir tom (eller alle avstander er ikke fullført) */ while (!pq.empty()) { // Det første toppunktet i par er minimumsavstanden // vertex, trekk det ut fra prioritetskøen.  // toppunktetiketten er lagret i andre av paret (det // må gjøres på denne måten for å holde toppunktene // sortert avstand (avstand må være første element // i par) int u = pq.top().second; pq.pop(); // 'i' brukes til å få alle tilstøtende hjørner av en // toppunktliste>::iterator i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Få toppunktetikett og vekt av gjeldende // ved siden av u.  int v = (*i).først;  int vekt = (*i).sekund;  // Hvis det er kortsluttet vei til v gjennom u.  if (avstand[v]> dist[u] + vekt) { // Oppdatering av avstand til v dist[v] = dist[u] + vekt;  pq.push(make_pair(avstand[v], v));  } } } // Skriv ut korteste avstander lagret i 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; }>
    Java
    import java.util.*; class Graph {  private int V;  private List> adj;  Graph(int V) { this.V = V;  adj = ny 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 = ny int[V];  Arrays.fill(dist, heltall.MAX_VALUE);  pq.add(ny iPair(0, src));  dist[kilde] = 0;  while (!pq.isEmpty()) { int u = pq.poll().second;  for (iPair v : adj.get(u)) { if (dist[v.first]> dist[u] + v.second) { dist[v.first] = dist[u] + v.second;  pq.add(ny iPair(dist[v.first], v.first));  } } } System.out.println('Vertex-avstand fra kilde');  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);  } }>
    Python
    import heapq # iPair ==>Heltallspar iPair = tuppel # Denne klassen representerer en rettet graf ved bruk av # tilstøtende listerepresentasjonsklasse Graph: def __init__(selv, V: int): # Konstruktør selv.V = V self.adj = [[] for _ i område(V) )] def addEdge(selv, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u,w)) # Skriver ut korteste veier fra src til alle andre toppunkter def shortestPath(self, src: int): # Opprett en prioritetskø for å lagre toppunkter som # blir forhåndsbehandlet pq = [] heapq.heappush(pq, (0, src)) # Lag en vektor for avstander og initialiser alle # avstander som uendelig (INF) dist = [float('inf')] * self.V dist[src] = 0 mens pq: # Det første toppunktet i par er minimumsavstanden # vertex, trekk den ut fra prioritetskøen. # toppunktetikett er lagret i andre av paret d, u = heapq.heappop(pq) # 'i' brukes til å få alle tilstøtende toppunkter av et # toppunkt for v, vekt i self.adj[u]: # If det er kortere vei til v gjennom u. if dist[v]> dist[u] + vekt: # Oppdaterer avstand til v dist[v] = dist[u] + vekt heapq.heappush(pq, (dist[v], v)) # Skriv ut korteste avstander lagret i dist[] for i in range(self.V): print(f'{i} 		 {dist[i]}') # Drivers kode hvis __navn__ == '__main__': # lag grafen gitt i figuren ovenfor V = 9 g = Graf(V) # lag den viste grafen over g.addEdge(0, 1, 4) g.addEdge(0, 7, 8) g.addEdge(1, 2, 8) g.addEdge(1, 7, 11) g.addEdge(2, 3, 7) g.addEdge(2, 8, 2) g.addEdge(2, 5, 4) g.addEdge(3, 4, 9) g.addEdge(3, 5, 14) g.addEdge(4, 5, 10) g.addEdge(5, 6, 2) g.addEdge(6, 7, 1) g.addEdge(6, 8, 6) g.addEdge(7, 8, 7) g.shortestPath(0)>
    C#
    using System; using System.Collections.Generic; // This class represents a directed graph using // adjacency list representation public class Graph {  private const int INF = 2147483647;  private int V;  private List [] adj;  public Graph(int V) { // Antall toppunkter dette.V = V;  // I en vektet graf må vi lagre toppunktet // og vektpar for hver kant 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 });  } // Skriver ut korteste veier fra src til alle andre toppunkter public void ShortestPath(int src) { // Opprett en prioritetskø for å lagre toppunkter som // blir forhåndsbehandlet.  SortertSett pq = nytt SortedSet (ny DistanceComparer());  // Lag en matrise for avstander og initialiser alle // avstander som uendelig (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) { // Det første toppunktet i par er minimumsavstanden // toppunkt, trekk det ut fra prioritetskøen.  // toppunktetiketten er lagret i andre av paret (det // må gjøres på denne måten for å holde toppunktene // sortert etter avstand) int[] minDistVertex = pq.Min;  pq.Remove(minDistVertex);  int u = minDistVertex[1];  // 'i' brukes til å få alle tilstøtende toppunkter av en // toppunkt foreach (int[] adjVertex i denne.adj[u]) { // Få toppunktetikett og vekt av gjeldende // ved siden av u.  int v = adjVertex[0];  int vekt = adjVertex[1];  // Hvis det er en kortere vei til v gjennom u.  if (avstand[v]> dist[u] + vekt) { // Oppdatering av avstand til v dist[v] = dist[u] + vekt;  pq.Add(new int[] { dist[v], v });  } } } // Skriv ut korteste avstander lagret i 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 Compare(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1];  } returner x[0] - y[0];  } } } public class Program { // Driver Code public static void Main() { // lag grafen gitt i figuren ovenfor int V = 9;  Graph g = new Graph(V);  // lage over vist graf g.AddEdge(0, 1, 4);  g.AddEdge(0, 7, 8);  g.AddEdge(1, 2, 8);  g.AddEdge(1, 7, 11);  g.AddEdge(2, 3, 7);  g.AddEdge(2, 8, 2);  g.AddEdge(2, 5, 4);  g.AddEdge(3, 4, 9);  g.AddEdge(3, 5, 14);  g.AddEdge(4, 5, 10);  g.AddEdge(5, 6, 2);  g.AddEdge(6, 7, 1);  g.AddEdge(6, 8, 6);  g.AddEdge(7, 8, 7);  g.ShortestPath(0);  } } // denne koden er bidratt av bhardwajji>
    Javascript
    // javascript Program to find Dijkstra's shortest path using // priority_queue in STL const INF = 2147483647; // This class represents a directed graph using // adjacency list representation class Graph {    constructor(V){    // No. of vertices  this.V = V;    // In a weighted graph, we need to store vertex  // and weight pair for every edge  this.adj = new Array(V);  for(let i = 0; i < V; i++){  this.adj[i] = new Array();  }  }  addEdge(u, v, w)  {  this.adj[u].push([v, w]);  this.adj[v].push([u, w]);  }  // Prints shortest paths from src to all other vertices  shortestPath(src)  {  // Create a priority queue to store vertices that  // are being preprocessed. This is weird syntax in C++.  // Refer below link for details of this syntax  // https://www.techcodeview.com  let pq = [];  // Create a vector for distances and initialize all  // distances as infinite (INF)  let dist = new Array(V).fill(INF);  // Insert source itself in priority queue and initialize  // its distance as 0.  pq.push([0, src]);  dist[src] = 0;  /* Looping till priority queue becomes empty (or all  distances are not finalized) */  while (pq.length>0) { // Det første toppunktet i par er minimumsavstanden // toppunkt, trekk det ut fra prioritetskøen.  // toppunktetiketten er lagret i andre av par (det // må gjøres på denne måten for å holde toppunktene // sortert avstand (avstand må være første element // i par) la u = pq[0][1]; pq.shift(); // 'i' brukes til å få alle tilstøtende hjørner av en // toppunkt for(la 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] + vekt) { // Oppdatering av avstand til v dist[v] = dist[u] + vekt;  pq.push([avstand[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) returner a[1] - b[1]; returner a[0] - b[0]; });  } } } // Skriv ut korteste avstander lagret i dist[] console.log('Vertex Distance from Source');  for (la 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.>

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

    Tidskompleksitet: O(E * logV), hvor E er antall kanter og V er antall toppunkter.
    Hjelpeplass: O(V)

    Anvendelser av Dijkstras algoritme:

    • Google Kart bruker Dijkstra-algoritmen for å vise korteste avstand mellom kilde og destinasjon.
    • I datanettverk , danner Dijkstras algoritme grunnlaget for ulike rutingprotokoller, som OSPF (Open Shortest Path First) og IS-IS (Intermediate System to Intermediate System).
    • Transport- og trafikkstyringssystemer bruker Dijkstras algoritme for å optimalisere trafikkflyten, minimere overbelastning og planlegge de mest effektive rutene for kjøretøy.
    • Flyselskaper bruker Dijkstras algoritme til å planlegge flyruter som minimerer drivstofforbruket og reduserer reisetiden.
    • Dijkstras algoritme brukes i elektronisk designautomatisering for ruting av tilkoblinger på integrerte kretser og veldig storskala integrasjon (VLSI) brikker.

    For en mer detaljert forklaring, se denne artikkelen Dijkstras korteste vei-algoritme ved hjelp av priority_queue av STL .