logo

Kā atrast īsākos ceļus no avota uz visām virsotnēm, izmantojot Dijkstra algoritmu

Ņemot vērā svērto grafiku un avota virsotni grafikā, atrodiet īsākos ceļus no avota uz visām pārējām virsotnēm dotajā grafā.

Piezīme: Dotajā grafikā nav nevienas negatīvas malas.

Piemēri:



Ievade: src = 0, grafiks ir parādīts zemāk.

1-(2)

Izvade: 0 4 12 19 21 11 9 8 14
Paskaidrojums: Attālums no 0 līdz 1 = 4.
Minimālais attālums no 0 līdz 2 = 12. 0->1->2
Minimālais attālums no 0 līdz 3 = 19. 0->1->2->3
Minimālais attālums no 0 līdz 4 = 21. 0->7->6->5->4
Minimālais attālums no 0 līdz 5 = 11. 0->7->6->5
Minimālais attālums no 0 līdz 6 = 9. 0->7->6
Minimālais attālums no 0 līdz 7 = 8. 0->7
Minimālais attālums no 0 līdz 8 = 14. 0->1->2->8

Ieteicamā prakse Dijkstra algoritma ieviešanai Izmēģiniet to!

Dijkstra algoritms, izmantojot Blakus matrica :

Ideja ir radīt a SPT (īsākā ceļa koks) ar doto avotu kā sakni. Uzturēt blakus matricu ar diviem komplektiem,

  • vienā komplektā ir virsotnes, kas iekļautas īsākā ceļa kokā,
  • cita kopa ietver virsotnes, kas vēl nav iekļautas īsākā ceļa kokā.

Katrā algoritma darbībā atrodiet virsotni, kas atrodas otrā kopā (kopa vēl nav iekļauta) un kurai ir minimālais attālums no avota.

Algoritms :

  • Izveidojiet komplektu sptSet (īsākā ceļa koka kopa), kas seko virsotnēm, kas iekļautas īsākā ceļa kokā, t.i., kuru minimālais attālums no avota tiek aprēķināts un pabeigts. Sākotnēji šis komplekts ir tukšs.
  • Piešķiriet attāluma vērtību visām virsotnēm ievades diagrammā. Inicializēt visas attāluma vērtības kā BEZGALĪGS . Piešķiriet attāluma vērtību 0 avota virsotnei, lai tā tiktu atlasīta vispirms.
  • Kamēr sptSet neietver visas virsotnes
    • Izvēlieties virsotni iekšā kas tur nav iekšā sptSet un tam ir minimālā attāluma vērtība.
    • Iekļaujiet jūs sptSet .
    • Pēc tam atjauniniet visu blakus esošo virsotņu attāluma vērtību iekšā .
      • Lai atjauninātu attāluma vērtības, atkārtojiet visas blakus esošās virsotnes.
      • Katrai blakus virsotnei iekšā, ja attāluma vērtības summa iekšā (no avota) un malas svars u-v , ir mazāka par attāluma vērtību iekšā , pēc tam atjauniniet attāluma vērtību iekšā .

Piezīme: Mēs izmantojam Būla masīvu sptSet[] lai attēlotu iekļauto virsotņu kopu SPT . Ja vērtība sptSet[v] ir taisnība, tad virsotne v ir iekļauta SPT , citādi nē. Masīvs dist[] tiek izmantots, lai saglabātu visu virsotņu īsāko attāluma vērtības.

Dijkstra algoritma ilustrācija :

Lai saprastu Dijkstra algoritmu, ņemsim grafiku un atrodam īsāko ceļu no avota uz visiem mezgliem.

Apsveriet zemāk esošo grafiku un src = 0

1-(2)

1. darbība:

  • Komplekts sptSet sākotnēji ir tukšs, un virsotnēm piešķirtie attālumi ir {0, INF, INF, INF, INF, INF, INF, INF} kur INF norāda uz bezgalīgu.
  • Tagad izvēlieties virsotni ar minimālo attāluma vērtību. Virsotne 0 ir izvēlēta, iekļaujiet to sptSet . Tātad sptSet kļūst par {0}. Pēc 0 līdz iekļaušanas sptSet , atjauniniet tā blakus esošo virsotņu attāluma vērtības.
  • 0 blakus esošās virsotnes ir 1 un 7. Attāluma vērtības 1 un 7 tiek atjauninātas kā 4 un 8.

Nākamajā apakšgrafikā ir redzamas virsotnes un to attāluma vērtības, tiek parādītas tikai virsotnes ar ierobežotām attāluma vērtībām. Virsotnes, kas iekļautas SPT ir parādīti zaļš krāsa.

6


2. darbība:

kā lejupielādēt mūziku
  • Izvēlieties virsotni ar minimālo attāluma vērtību, kas vēl nav iekļauta SPT (nav iekšā sptSET ). Virsotne 1 tiek izvēlēta un pievienota sptSet .
  • Tātad sptSet tagad kļūst par {0, 1}. Atjauniniet 1 blakus esošo virsotņu attāluma vērtības.
  • Virsotnes 2 attāluma vērtība kļūst 12 .
    4


3. darbība:

  • Izvēlieties virsotni ar minimālo attāluma vērtību, kas vēl nav iekļauta SPT (nav iekšā sptSET ). Ir izvēlēta virsotne 7. Tātad sptSet tagad kļūst {0, 1, 7}.
  • Atjauniniet 7 blakus esošo virsotņu attāluma vērtības. Virsotņu 6 un 8 attāluma vērtība kļūst ierobežota ( 15 un 9 attiecīgi).
    5


4. darbība:

  • Izvēlieties virsotni ar minimālo attāluma vērtību, kas vēl nav iekļauta SPT (nav iekšā sptSET ). Ir izvēlēta virsotne 6. Tātad sptSet tagad kļūst {0, 1, 7, 6} .
  • Atjaunināt 6 blakus esošo virsotņu attāluma vērtības. Virsotnes 5 un 8 attāluma vērtība tiek atjaunināta.
    3-(1)


Mēs atkārtojam iepriekš minētās darbības, līdz sptSet ietilpst visas dotā grafa virsotnes. Visbeidzot, mēs iegūstam šādu S hortest Path Tree (SPT).

2-(2)

Tālāk ir aprakstīta iepriekš minētās pieejas īstenošana.

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 un sptSet[y] == False un  dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Draivera kods, ja __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) # Šo kodu ir sagatavojis Divyanshu Mehta, un to atjaunināja Pranavs Singhs Sambyals>>C#
Javascript
// A Javascript program for Dijkstra's single  // source shortest path algorithm.  // The program is for adjacency matrix  // representation of the graph  let V = 9; // A utility function to find the  // vertex with minimum distance  // value, from the set of vertices  // not yet included in shortest  // path tree  function minDistance(dist,sptSet) {    // Initialize min value   let min = Number.MAX_VALUE;  let min_index = -1;    for(let v = 0; v < V; v++)  {  if (sptSet[v] == false && dist[v] <= min)   {  min = dist[v];  min_index = v;  }  }  return min_index; } // A utility function to print  // the constructed distance array  function printSolution(dist) {  console.log('Vertex 		 Distance from Source ');  for(let i = 0; i < V; i++)  {  console.log(i + ' 		 ' +   dist[i] + ' ');  } } // Function that implements Dijkstra's  // single source shortest path algorithm  // for a graph represented using adjacency  // matrix representation  function dijkstra(graph, src) {  let dist = new Array(V);  let sptSet = new Array(V);    // Initialize all distances as   // INFINITE and stpSet[] as false   for(let i = 0; i < V; i++)  {  dist[i] = Number.MAX_VALUE;  sptSet[i] = false;  }    // Distance of source vertex   // from itself is always 0   dist[src] = 0;    // Find shortest path for all vertices   for(let count = 0; count < V - 1; count++)  {    // Pick the minimum distance vertex   // from the set of vertices not yet   // processed. u is always equal to   // src in first iteration.   let u = minDistance(dist, sptSet);    // Mark the picked vertex as processed   sptSet[u] = true;    // Update dist value of the adjacent   // vertices of the picked vertex.   for(let v = 0; v < V; v++)  {    // Update dist[v] only if is not in   // sptSet, there is an edge from u   // to v, and total weight of path   // from src to v through u is smaller   // than current value of dist[v]   if (!sptSet[v] && graph[u][v] != 0 &&   dist[u] != Number.MAX_VALUE &&  dist[u] + graph[u][v] < dist[v])  {  dist[v] = dist[u] + graph[u][v];  }  }  }    // Print the constructed distance array  printSolution(dist); } // Driver code let graph = [ [ 0, 4, 0, 0, 0, 0, 0, 8, 0 ],  [ 4, 0, 8, 0, 0, 0, 0, 11, 0 ],  [ 0, 8, 0, 7, 0, 4, 0, 0, 2 ],  [ 0, 0, 7, 0, 9, 14, 0, 0, 0],  [ 0, 0, 0, 9, 0, 10, 0, 0, 0 ],  [ 0, 0, 4, 14, 10, 0, 2, 0, 0],  [ 0, 0, 0, 0, 0, 2, 0, 1, 6 ],  [ 8, 11, 0, 0, 0, 0, 1, 0, 7 ],  [ 0, 0, 2, 0, 0, 0, 6, 7, 0 ] ] dijkstra(graph, 0); // This code is contributed by rag2127>

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

Laika sarežģītība: O(V2)
Palīgtelpa: O(V)

Piezīmes:

  • Kods aprēķina īsāko attālumu, bet neaprēķina informāciju par ceļu. Izveidojiet vecāku masīvu, atjauniniet vecāku masīvu, kad tiek atjaunināts attālums, un izmantojiet to, lai parādītu īsāko ceļu no avota uz dažādām virsotnēm.
  • Laiks Īstenošanas sarežģītība ir O(V 2 ) . Ja ievade grafiks tiek attēlots, izmantojot blakus esošo sarakstu , to var reducēt līdz O(E * log V) ar binārās kaudzes palīdzību. Lūdzu apskati Dijkstras algoritms blakus esošo sarakstu attēlošanai lai iegūtu sīkāku informāciju.
  • Dijkstras algoritms nedarbojas grafikiem ar negatīviem svara cikliem.

Kāpēc Dijkstras algoritmi neizdodas grafikiem ar negatīvām malām?

Problēma ar negatīvajiem svariem rodas tāpēc, ka Dijkstra algoritms pieņem, ka, tiklīdz mezgls ir pievienots apmeklēto mezglu kopai, tā attālums tiek pabeigts un nemainīsies. Tomēr negatīvu svaru klātbūtnē šis pieņēmums var novest pie nepareiziem rezultātiem.

Apsveriet šādu grafiku kā piemēru:

Dijkstra neveiksme negatīvo malu gadījumā

Iepriekš minētajā grafikā A ir avota mezgls starp malām A uz B un A uz C , A uz B ir mazāks svars, un Dijkstra piešķir īsāko attālumu B kā 2, bet gan tāpēc, ka pastāv negatīva mala no C uz B , faktiskais īsākais attālums samazinās līdz 1, ko Dijkstra nespēj noteikt.

Piezīme: Mēs izmantojam Belmana Forda īsākā ceļa algoritms gadījumā, ja grafikā ir negatīvas malas.

Dijkstra algoritms, izmantojot Blakus esošo vietu saraksts O(E logV):

Dijkstra algoritmu vienmēr ieteicams izmantot Ikreiz, kad tiek samazināts virsotnes attālums, priority_queue mēs pievienojam vēl vienu virsotnes gadījumu. Pat ja ir vairāki gadījumi, mēs ņemam vērā tikai gadījumu ar minimālu attālumu un ignorējam citus gadījumus.

  • Laika sarežģītība paliek O(E * LogV) jo prioritātes rindā būs ne vairāk kā O(E) virsotnes un O(logE) ir tāds pats kā O(logV)
  • Tālāk ir aprakstīta iepriekš minētās pieejas īstenošana.

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Integer Pair typedef pāris iPair; // Šī klase attēlo virzītu grafiku, izmantojot // blakus esošo sarakstu reprezentācijas klase Graph { int V; // Virsotņu skaits // Svērtajā grafikā mums ir jāsaglabā virsotnes // un svara pāris katram malu sarakstam>> adj; public: Graph(int V); // Konstruktors // funkcija malas pievienošanai grafikam void addEdge(int u, int v, int w);  // izdrukā īsāko ceļu no s void shortestPath(int s); }; // Piešķir atmiņu blakus sarakstam Graph::Graph(int V) { this->V = V;  adj = jauns saraksts [V]; } void Graph::pievienotEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w));  adj[v].push_back(make_pair(u, w)); } // Drukā īsākos ceļus no src uz visām pārējām virsotnēm void Graph::shortestPath(int src) { // Izveidojiet prioritāru rindu, lai saglabātu virsotnes, kuras // tiek iepriekš apstrādātas. Šī ir dīvaina sintakse valodā C++.  // Sīkāku informāciju par šo sintaksi skatiet tālāk norādītajā saitē // https://www.techcodeview.com priority_queue , lielāks > pq;  // Izveidojiet vektoru attālumiem un inicializējiet visus // attālumus kā bezgalīgu (INF) vektoru dist(V, INF);  // Ievietot pašu avotu prioritārā rindā un inicializēt // tā attālumu kā 0. pq.push(make_pair(0, src));  dist[src] = 0;  /* Cilpas, līdz prioritātes rinda kļūst tukša (vai visi attālumi nav pabeigti) */ while (!pq.empty()) { // Pirmā virsotne pārī ir minimālais attālums // virsotne, izņemiet to no prioritārās rindas.  // virsotnes etiķete tiek saglabāta pāra otrajā daļā (tas // ir jādara šādi, lai saglabātu virsotnes // sakārtotu attālumu (attālumam jābūt pirmajam vienumam // pārī) int u = pq.top().second; pq.pop(); // 'i' tiek izmantots, lai iegūtu visas // virsotņu saraksta blakus esošās virsotnes>::iterators i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Iegūt virsotnes etiķeti un strāvas svaru // blakus u.  int v = (*i).pirmais;  int svars = (*i).sekunde;  // Ja ir saīsināts ceļš uz v caur u.  if (dist[v]> dist[u] + svars) { // Atjaunināšanas attālums v dist[v] = dist[u] + svars;  pq.push(make_pair(dist[v], v));  } } } // Drukāt īsākos attālumus, kas saglabāti 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;  Grafs(int V) { this.V = V;  adj = jauns 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 = jauns int[V];  Masīvi.fill(dist, Vesels skaitlis.MAX_VALUE);  pq.add(jauns iPair(0, src));  dist[src] = 0;  while (!pq.isEmpty()) { int u = pq.poll().second;  for (iPair v : adj.get(u)) { if (dist[v.first]> dist[u] + v.second) { dist[v.first] = dist[u] + v.second;  pq.add(jauns iPair(dist[v.first], v.first));  } } } System.out.println('Vertex attālums no avota');  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 ==>Veselu skaitļu pāris iPair = korte # Šī klase attēlo virzītu grafiku, izmantojot # blakusesību saraksta reprezentācijas klasi Grafs: def __init__(self, V: int): # Konstruktors self.V = V self.adj = [[] for _ diapazonā(V) )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u, w)) # Drukā īsākos ceļus no src uz visām pārējām virsotnēm def shortestPath(self, src: int): # Izveidojiet prioritāru rindu, lai saglabātu virsotnes, kuras # tiek iepriekš apstrādātas pq = [] heapq.heappush(pq, (0, src)) # Izveidojiet vektoru attālumiem un inicializējiet visus # attālumus kā bezgalīgus (INF) dist = [float('inf')] * self.V dist[src] = 0, kamēr pq: # Pirmā virsotne pārī ir minimālais attālums # virsotne, izņemiet to no prioritārās rindas. # virsotnes etiķete tiek saglabāta pāra d otrajā daļā, u = heapq.heappop(pq) # 'i' tiek izmantots, lai iegūtu visas blakus esošās # virsotnes virsotnes v, svars iekšā self.adj[u]: # Ja ir saīsināts ceļš uz v caur u. if dist[v]> dist[u] + svars: # Atjauno attālumu no v dist[v] = dist[u] + svars heapq.heappush(pq, (dist[v], v)) # Drukāt īsākos attālumus, kas saglabāti dist[] i diapazonā (self.V): print(f'{i} 		 {dist[i]}') # Draivera kods, ja __name__ == '__main__': # izveidojiet grafiku, kas parādīts iepriekš attēlā V = 9 g = Grafs(V) # izveidojot iepriekš parādīto grafiku g.addEdge(0, 1, 4) g.addEdge(0, 7, 8) g.addEdge(1, 2, 8) g.pievienotEdge(1, 7, 11) g.addEdge(2, 3, 7) g.addEdge(2, 8, 2) g.addEdge(2, 5, 4) g.addEdge(3, 4, 9) g.pievienotEdge(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) { // Virsotņu skaits this.V = V;  // Svērtā grafikā katrai malai ir jāsaglabā virsotne // un svara pāris 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 });  } // Drukā īsākos ceļus no src uz visām pārējām virsotnēm public void ShortestPath(int src) { // Izveidojiet prioritāru rindu, lai saglabātu virsotnes, kuras // tiek iepriekš apstrādātas.  SakārtotsSet pq = jauns SortedSet (jauns DistanceComparer());  // Izveidot masīvu attālumiem un inicializēt visus // attālumus kā bezgalīgus (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) { // Pirmā virsotne pārī ir minimālais attālums // virsotne, izņemiet to no prioritārās rindas.  // virsotņu etiķete tiek saglabāta pāra otrajā daļā (tas // ir jādara šādi, lai virsotnes saglabātu // sakārtotas pēc attāluma) int[] minDistVertex = pq.Min;  pq.Remove(minDistVertex);  int u = minDistVertex[1];  // 'i' tiek izmantots, lai iegūtu visas // virsotnes blakus esošās virsotnes foreach (int[] adjVertex šajā.adj[u]) { // Iegūt virsotnes etiķeti un strāvas svaru // blakus u.  int v = adjVertex[0];  int svars = adjVertex[1];  // Ja ir īsāks ceļš uz v caur u.  if (dist[v]> dist[u] + svars) { // Atjaunināšanas attālums v dist[v] = dist[u] + svars;  pq.Add(new int[] { dist[v], v });  } } } // Drukāt īsākos attālumus, kas saglabāti 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 Salīdzināt(int[] x, int[] y) { if (x[0] == y[0]) { return x[1] - y[1];  } atgriešanās x[0] - y[0];  } } } public class Programma { // Draivera kods public static void Main() { // izveido diagrammu, kas norādīta iepriekš attēlā int V = 9;  Grafs g = jauns Grafs(V);  // izveidojot augstāk parādīto grafiku g.AddEdge(0, 1, 4);  g.PievienotEdge(0, 7, 8);  g.PievienotEdge(1, 2, 8);  g.PievienotEdge(1, 7, 11);  g.PievienotEdge(2, 3, 7);  g.PievienotEdge(2, 8, 2);  g.PievienotEdge(2, 5, 4);  g.PievienotEdge(3, 4, 9);  g.PievienotEdge(3, 5, 14);  g.PievienotEdge(4, 5, 10);  g.PievienotEdge(5, 6, 2);  g.PievienotEdge(6, 7, 1);  g.PievienotEdge(6, 8, 6);  g.PievienotEdge(7, 8, 7);  g.ShortestPath(0);  } } // šo kodu nodrošina 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) { // Pirmā virsotne pārī ir minimālais attālums // virsotne, izņemiet to no prioritārās rindas.  // virsotņu etiķete tiek saglabāta pāra otrajā daļā (tas // ir jādara šādi, lai saglabātu virsotnes // sakārtotu attālumu (attālumam jābūt pirmajam vienumam // pārī) lai u = pq[0][1]; pq.shift(); // 'i' tiek izmantots, lai iegūtu visas blakus esošās virsotnes // virsotnes for(lai 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] + svars) { // V atjaunināšanas attālums dist[v] = dist[u] + svars;  pq.push([dist[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; });  } } } // Drukāt īsākos attālumus, kas saglabāti dist[] console.log('Vertex Distance from Source');  for (lai 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.>

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

    Laika sarežģītība: O(E * logV), kur E ir šķautņu skaits un V ir virsotņu skaits.
    Palīgtelpa: O(V)

    Dijkstra algoritma pielietojumi:

    • Google kartes izmanto Dijkstra algoritmu, lai parādītu īsāko attālumu starp avotu un galamērķi.
    • In datortīklošana Dijkstra algoritms veido pamatu dažādiem maršrutēšanas protokoliem, piemēram, OSPF (Vispirms atvērts īsākais ceļš) un IS-IS (Intermediate System to Intermediate System).
    • Transporta un satiksmes vadības sistēmas izmanto Dijkstra algoritmu, lai optimizētu satiksmes plūsmu, samazinātu sastrēgumus un plānotu visefektīvākos transportlīdzekļu maršrutus.
    • Aviokompānijas izmanto Dijkstra algoritmu, lai plānotu lidojumu maršrutus, kas samazina degvielas patēriņu un samazina ceļojuma laiku.
    • Dijkstra algoritms tiek izmantots elektroniskā dizaina automatizācijā, lai maršrutētu savienojumus uz integrālajām shēmām un ļoti liela mēroga integrācijas (VLSI) mikroshēmām.

    Sīkāku skaidrojumu skatiet šajā rakstā Dijkstra īsākā ceļa algoritms, izmantojot STL priority_queue .