logo

Sådan finder du korteste veje fra kilden til alle hjørner ved hjælp af Dijkstras algoritme

Givet en vægtet graf og et kildepunkt i grafen, find korteste veje fra kilden til alle de andre hjørner i den givne graf.

Bemærk: Den givne graf indeholder ingen negativ kant.



Eksempler:

Input: src = 0, grafen er vist nedenfor.

1-(2)

Produktion: 0 4 12 19 21 11 9 8 14
Forklaring: Afstanden fra 0 til 1 = 4.
Minimumafstanden fra 0 til 2 = 12. 0->1->2
Minimumafstanden fra 0 til 3 = 19. 0->1->2->3
Minimumsafstanden fra 0 til 4 = 21. 0->7->6->5->4
Minimumafstanden fra 0 til 5 = 11. 0->7->6->5
Minimumafstanden fra 0 til 6 = 9. 0->7->6
Minimumsafstanden fra 0 til 7 = 8. 0->7
Minimumsafstanden fra 0 til 8 = 14. 0->1->2->8



'prim's algoritme'
Anbefalet praksis for implementering af Dijkstra-algoritmen Prøv det!

Dijkstras algoritme ved hjælp af Adjacency Matrix :

Ideen er at generere en SPT (korteste vejtræ) med en given kilde som rod. Oprethold en Adjacency Matrix med to sæt,

  • et sæt indeholder hjørner inkluderet i træet med den korteste vej,
  • andet sæt inkluderer hjørner, der endnu ikke er inkluderet i træet med den korteste vej.

Ved hvert trin i algoritmen skal du finde et toppunkt, der er i det andet sæt (sæt endnu ikke inkluderet) og har en minimumsafstand fra kilden.

Algoritme :



  • Opret et sæt sptSet (korteste vej-træsæt), der holder styr på toppunkter, der er inkluderet i det korteste vejtræ, dvs. hvis minimumsafstand fra kilden beregnes og afsluttes. I første omgang er dette sæt tomt.
  • Tildel en afstandsværdi til alle hjørner i inputgrafen. Initialiser alle afstandsværdier som UENDELIG . Tildel afstandsværdien som 0 for kildehjørnet, så det vælges først.
  • Mens sptSet omfatter ikke alle hjørner
    • Vælg et toppunkt i det er der ikke i sptSet og har en minimumsafstandsværdi.
    • Inkluder dig til sptSet .
    • Opdater derefter afstandsværdien for alle tilstødende hjørner af i .
      • For at opdatere afstandsværdierne, gentag gennem alle tilstødende hjørner.
      • For hvert tilstødende toppunkt i, hvis summen af ​​afstandsværdien af i (fra kilde) og vægt af kant u-v , er mindre end afstandsværdien af i , og opdater derefter afstandsværdien for i .

Bemærk: Vi bruger et boolesk array sptSet[] at repræsentere det sæt af hjørner, der er inkluderet i SPT . Hvis en værdi sptSet[v] er sandt, så er toppunkt v inkluderet i SPT , ellers ikke. Array dist[] bruges til at gemme de korteste afstandsværdier af alle hjørner.

bibliotek omdøb linux

Illustration af Dijkstra Algorithm :

For at forstå Dijkstras algoritme kan vi tage en graf og finde den korteste vej fra kilden til alle noder.

Overvej nedenstående graf og src = 0

1-(2)

Trin 1:

  • Sættet sptSet er oprindeligt tom, og afstande tildelt til toppunkter er {0, INF, INF, INF, INF, INF, INF, INF} hvor INF angiver uendelig.
  • Vælg nu toppunktet med en minimumsafstandsværdi. Toppunktet 0 er valgt, inkluder det i sptSet . Så sptSet bliver {0}. Efter at have inkluderet 0 til sptSet , opdatere afstandsværdier for dets tilstødende hjørner.
  • Tilstødende hjørner på 0 er 1 og 7. Afstandsværdierne på 1 og 7 opdateres som 4 og 8.

Følgende undergraf viser toppunkter og deres afstandsværdier, kun toppunkter med endelige afstandsværdier vises. De hjørner, der indgår i SPT er vist i grøn farve.

6


Trin 2:

hvordan man kører et script i linux
  • Vælg toppunktet med minimum afstandsværdi og ikke allerede inkluderet i SPT (ikke i sptSET ). Toppunktet 1 plukkes og tilføjes sptSet .
  • sptSet bliver nu til {0, 1}. Opdater afstandsværdierne for tilstødende hjørner på 1.
  • Afstandsværdien af ​​toppunkt 2 bliver 12 .
    4


Trin 3:

  • Vælg toppunktet med minimum afstandsværdi og ikke allerede inkluderet i SPT (ikke i sptSET ). Vertex 7 er valgt. Så sptSet nu bliver {0, 1, 7}.
  • Opdater afstandsværdierne for tilstødende toppunkter på 7. Afstandsværdien for toppunkt 6 og 8 bliver endelig ( 15 og 9 henholdsvis).
    5


Trin 4:

  • Vælg toppunktet med minimum afstandsværdi og ikke allerede inkluderet i SPT (ikke i sptSET ). Vertex 6 er valgt. Så sptSet nu bliver {0, 1, 7, 6} .
  • Opdater afstandsværdierne for tilstødende toppunkter på 6. Afstandsværdien for toppunkt 5 og 8 opdateres.
    3-(1)


Vi gentager ovenstående trin indtil sptSet omfatter alle hjørner af den givne graf. Til sidst får vi følgende S hortest Path Tree (SPT).

2-(2)

Nedenfor er implementeringen af ​​ovenstående tilgang:

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

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

Tidskompleksitet: O(V2)
Hjælpeplads: O(V)

hvordan man injicerer mock abstrakt klasse

Bemærkninger:

  • Koden beregner den korteste afstand, men beregner ikke stiinformationen. Opret et overordnet array, opdater det overordnede array, når afstanden er opdateret, og brug det til at vise den korteste vej fra kilden til forskellige hjørner.
  • Tiden Kompleksiteten af ​​implementeringen er O(V 2 ) . Hvis input grafen er repræsenteret ved hjælp af tilgrænsende liste , kan den reduceres til O(E * log V) ved hjælp af en binær heap. Se venligst Dijkstras algoritme for tilgrænsende listerepræsentation for flere detaljer.
  • Dijkstras algoritme virker ikke for grafer med negative vægtcyklusser.

Hvorfor Dijkstras algoritmer mislykkes for graferne med negative kanter?

Problemet med negative vægte opstår fra det faktum, at Dijkstras algoritme antager, at når en node er tilføjet til sættet af besøgte noder, er dens afstand afsluttet og vil ikke ændre sig. Men i tilfælde af negative vægte kan denne antagelse føre til forkerte resultater.

Overvej følgende graf for eksemplet:

substring_index i sql
Fejl-af-Dijkstra-i-tilfælde-af-negative-kanter

I ovenstående graf er A kildenoden blandt kanterne EN til B og EN til C , EN til B er den mindre vægt og Dijkstra tildeler den korteste afstand af B som 2, men på grund af eksistensen af ​​en negativ kant fra C til B , reduceres den faktiske korteste afstand til 1, hvilket Dijkstra ikke kan registrere.

Bemærk: Vi bruger Bellman Fords korteste vej-algoritme i tilfælde af at vi har negative kanter i grafen.

Dijkstras algoritme ved hjælp af Tilgrænsende liste i O(E logV):

For Dijkstras algoritme anbefales det altid at bruge Når afstanden af ​​et toppunkt reduceres, tilføjer vi endnu en forekomst af et toppunkt i priority_queue. Selvom der er flere forekomster, betragter vi kun forekomsten med minimumsafstand og ignorerer andre forekomster.

  • Tidskompleksiteten forbliver O(E * LogV) da der højst vil være O(E) toppunkter i prioritetskøen og O(logE) er det samme som O(logV)
  • Nedenfor er implementeringen af ​​ovenstående tilgang:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Heltal Par typedef par iPair; // Denne klasse repræsenterer en rettet graf ved hjælp af // adjacency list repræsentationsklasse Graph { int V; // Antal hjørner // I en vægtet graf skal vi gemme toppunkter // og vægtpar for hver kantliste>* adj; public: Graph(int V); // Konstruktør // funktion til at tilføje en kant til grafen void addEdge(int u, int v, int w);  // udskriver korteste vej fra s void shortestPath(int s); }; // Tildeler hukommelse til tilgrænsende 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)); } // Udskriver korteste stier fra src til alle andre vertices void Graph::shortestPath(int src) { // Opret en prioritetskø for at gemme vertices, der // er ved at blive forbehandlet. Dette er mærkelig syntaks i C++.  // Se nedenstående link for detaljer om denne syntaks // https://www.techcodeview.com priority_queue , større > pq;  // Opret en vektor for afstande og initialiser alle // afstande som uendelig (INF) vektor dist(V, INF);  // Indsæt selve kilden i prioritetskøen og initialiser // dens afstand som 0. pq.push(make_pair(0, src));  dist[kilde] = 0;  /* Looping indtil prioritetskøen bliver tom (eller alle afstande er ikke afsluttet) */ while (!pq.empty()) { // Det første vertex i par er minimumafstanden // vertex, udtræk det fra prioritetskøen.  // vertex label er gemt i anden af ​​par (det // skal gøres på denne måde for at holde hjørnerne // sorteret afstand (afstand skal være første element // i par) int u = pq.top().second; pq.pop(); // 'i' bruges til at få alle tilstødende hjørner af en // vertexliste>::iterator i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Få toppunkts-etiket og vægten af ​​nuværende // ved siden af ​​u.  int v = (*i).først;  int vægt = (*i).sekund;  // Hvis der er kort vej til v gennem u.  if (dist[v]> dist[u] + vægt) { // Opdatering af afstand af v dist[v] = dist[u] + vægt;  pq.push(make_pair(dist[v], v));  } } } // Udskriv korteste afstande gemt i dist[] printf('Handpunktsafstand fra kilde
    ');  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, heltal.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 afstand 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 ==>Heltalspar iPair = tuple # Denne klasse repræsenterer en rettet graf ved hjælp af # tilstødende listerepræsentationsklasse 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)) # Udskriver korteste stier fra src til alle andre hjørner def shortestPath(selv, src: int): # Opret en prioritetskø til at gemme spidser, som # bliver forbehandlet pq = [] heapq.heappush(pq, (0, src)) # Opret en vektor for afstande og initialiser alle # afstande som uendelig (INF) dist = [float('inf')] * self.V dist[src] = 0 mens pq: # Det første toppunkt i par er minimumsafstanden # vertex, udtræk det fra prioritetskøen. # vertex-etiket er gemt i anden af ​​par d, u = heapq.heappop(pq) # 'i' bruges til at få alle tilstødende hjørner af et # vertex for v, vægt i self.adj[u]: # Hvis der er kort vej til v gennem u. if dist[v]> dist[u] + vægt: # Opdatering af afstand af v dist[v] = dist[u] + vægt heapq.heappush(pq, (dist[v], v)) # Udskriv korteste afstande gemt i dist[] for i in range(self.V): print(f'{i} 		 {dist[i]}') # Drivers kode hvis __navn__ == '__main__': # lav grafen vist i ovenstående figur V = 9 g = Graph(V) # lav ovenstående viste graf g.addEdge(0, 1, 4) g.addEdge(0, 7, 8) g.addEdge(1, 2, 8) g.addEdge(1, 7, 11) g.addEdge(2, 3, 7) g.addEdge(2, 8, 2) g.addEdge(2, 5, 4) g.addEdge(3, 4, 9) g.addEdge(3, 5, 14) g.addEdge(4, 5, 10) g.addEdge(5, 6, 2) g.addEdge(6, 7, 1) g.addEdge(6, 8, 6) g.addEdge(7, 8, 7) g.shortestPath(0)>
    C#
    using System; using System.Collections.Generic; // This class represents a directed graph using // adjacency list representation public class Graph {  private const int INF = 2147483647;  private int V;  private List [] adj;  public Graph(int V) { // Antal hjørner dette.V = V;  // I en vægtet graf skal vi gemme vertex // og vægtpar 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(ny int[] { u, w });  } // Udskriver korteste stier fra src til alle andre vertices public void ShortestPath(int src) { // Opret en prioritetskø for at gemme vertices, der // er ved at blive forbehandlet.  Sorteret Sæt pq = nyt SortedSet (ny DistanceComparer());  // Opret en matrix for afstande og initialiser alle // afstande 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 toppunkt i par er minimumafstanden // vertex, udtræk det fra prioritetskøen.  // vertex label er gemt i anden af ​​par (det // skal gøres på denne måde for at holde hjørnerne // sorteret efter afstand) int[] minDistVertex = pq.Min;  pq.Remove(minDistVertex);  int u = minDistVertex[1];  // 'i' bruges til at få alle tilstødende hjørner af en // vertex foreach (int[] adjVertex i denne.adj[u]) { // Hent toppunkts-etiket og vægten af ​​nuværende // ved siden af ​​u.  int v = adjVertex[0];  int vægt = adjVertex[1];  // Hvis der er en kortere vej til v gennem u.  if (dist[v]> dist[u] + vægt) { // Opdatering af afstand af v dist[v] = dist[u] + vægt;  pq.Add(ny int[] { dist[v], v });  } } } // Udskriv korteste afstande gemt i dist[] Console.WriteLine('Vertex afstand fra kilde');  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() { // create the graph given in above figure int V = 9;  Graph g = new Graph(V);  // laver ovenstående viste 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 kode er bidraget af 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 toppunkt i par er minimumafstanden // vertex, udtræk det fra prioritetskøen.  // vertex label er gemt i anden af ​​par (det // skal gøres på denne måde for at holde hjørnerne // sorteret afstand (afstand skal være første element // i par) lad u = pq[0][1]; pq.shift(); // 'i' bruges til at få alle tilstødende hjørner af et // vertex for(lad 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] + vægt) { // Opdatering af afstand af v dist[v] = dist[u] + vægt;  pq.push([dist[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; });  } } } // Udskriv korteste afstande gemt i dist[] console.log('Vertex Distance from Source');  for (lad i = 0; i< V; ++i)  console.log(i, ' ', dist[i]);  } } // Driver's code // create the graph given in above figure let V = 9; let g = new Graph(V); // making above shown graph g.addEdge(0, 1, 4); g.addEdge(0, 7, 8); g.addEdge(1, 2, 8); g.addEdge(1, 7, 11); g.addEdge(2, 3, 7); g.addEdge(2, 8, 2); g.addEdge(2, 5, 4); g.addEdge(3, 4, 9); g.addEdge(3, 5, 14); g.addEdge(4, 5, 10); g.addEdge(5, 6, 2); g.addEdge(6, 7, 1); g.addEdge(6, 8, 6); g.addEdge(7, 8, 7); // Function call g.shortestPath(0); // The code is contributed by Nidhi goel.>

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

    Tidskompleksitet: O(E * logV), hvor E er antallet af kanter og V er antallet af hjørner.
    Hjælpeplads: O(V)

    Anvendelser af Dijkstras algoritme:

    • Google kort bruger Dijkstra-algoritmen til at vise korteste afstand mellem kilde og destination.
    • I computernetværk , danner Dijkstras algoritme grundlaget for forskellige routingprotokoller, såsom OSPF (Open Shortest Path First) og IS-IS (Intermediate System to Intermediate System).
    • Transport- og trafikstyringssystemer bruger Dijkstras algoritme til at optimere trafikstrømmen, minimere trængsel og planlægge de mest effektive ruter for køretøjer.
    • Flyselskaber bruger Dijkstras algoritme til at planlægge flyruter, der minimerer brændstofforbruget og reducerer rejsetiden.
    • Dijkstras algoritme anvendes i elektronisk designautomatisering til routing af forbindelser på integrerede kredsløb og meget storskala integration (VLSI) chips.

    For en mere detaljeret forklaring henvises til denne artikel Dijkstras Shortest Path Algorithm ved hjælp af priority_queue af STL .