logo

Як знайти найкоротші шляхи від джерела до всіх вершин за допомогою алгоритму Дейкстри

Дано зважений граф і вихідну вершину в графі, знайдіть найкоротші шляхи від джерела до всіх інших вершин у даному графі.

Примітка: Даний граф не містить жодного негативного ребра.

приклади:



введення: src = 0, графік показаний нижче.

1-(2)

Вихід: 0 4 12 19 21 11 9 8 14
Пояснення: Відстань від 0 до 1 = 4.
Мінімальна відстань від 0 до 2 = 12. 0->1->2
Мінімальна відстань від 0 до 3 = 19. 0->1->2->3
Мінімальна відстань від 0 до 4 = 21. 0->7->6->5->4
Мінімальна відстань від 0 до 5 = 11. 0->7->6->5
Мінімальна відстань від 0 до 6 = 9. 0->7->6
Мінімальна відстань від 0 до 7 = 8. 0->7
Мінімальна відстань від 0 до 8 = 14. 0->1->2->8

як дізнатися розмір монітора?
Рекомендована практика впровадження алгоритму Дейкстри. Спробуйте!

Використання алгоритму Дейкстри Матриця суміжності :

Ідея полягає в тому, щоб створити a SPT (дерево найкоротшого шляху) із заданим джерелом як коренем. Підтримувати матрицю суміжності з двома наборами,

  • один набір містить вершини, включені в дерево найкоротшого шляху,
  • інший набір включає вершини, які ще не включені в дерево найкоротшого шляху.

На кожному кроці алгоритму знайдіть вершину, яка знаходиться в іншому наборі (набір ще не включений) і має мінімальну відстань від джерела.

Алгоритм :

10 мл до унцій
  • Створіть набір sptSet (набір дерев найкоротшого шляху), який відстежує вершини, включені в дерево найкоротшого шляху, тобто мінімальна відстань від джерела яких обчислюється та завершується. Спочатку цей набір порожній.
  • Призначте значення відстані всім вершинам у вхідному графі. Ініціалізуйте всі значення відстані як БЕЗКОНЕЧНА . Призначте значення відстані 0 для вихідної вершини, щоб вона вибиралася першою.
  • Поки sptSet не включає всі вершини
    • Виберіть вершину в цього немає в sptSet і має мінімальне значення відстані.
    • Включити вас до sptSet .
    • Потім оновіть значення відстані всіх суміжних вершин в .
      • Щоб оновити значення відстані, пройдіть по всіх суміжних вершинах.
      • Для кожної сусідньої вершини в, якщо сума величини відстані в (з джерела) і вага краю u-v , менше значення відстані в , потім оновіть значення відстані в .

Примітка: Ми використовуємо логічний масив sptSet[] щоб представити набір вершин, включених до SPT . Якщо значення sptSet[v] істинно, то вершина v включена в SPT , інакше ні. Масив dist[] використовується для зберігання найкоротших значень відстані всіх вершин.

Ілюстрація алгоритму Дейкстри :

Щоб зрозуміти алгоритм Дейкстри, візьмемо графік і знайдемо найкоротший шлях від джерела до всіх вузлів.

Розглянемо наведений нижче графік і src = 0

1-(2)

Крок 1:

  • Набір sptSet початково порожній, а відстані, призначені вершинам: {0, INF, INF, INF, INF, INF, INF, INF}, де ІНФ вказує на нескінченність.
  • Тепер виберіть вершину з мінімальним значенням відстані. Вибирається вершина 0, включаємо її sptSet . Так sptSet стає {0}. Після включення 0 до sptSet , оновити значення відстані до його суміжних вершин.
  • Сусідні вершини 0 — це 1 і 7. Значення відстані 1 і 7 оновлюються як 4 і 8.

Наступний підграф показує вершини та значення їх відстані, показані лише вершини зі скінченними значеннями відстані. Вершини, що входять до SPT показані в зелений колір.

6


Крок 2:

випадкове число в java
  • Виберіть вершину з мінімальним значенням відстані, яка ще не включена SPT (не в sptSET ). Вибирається та додається вершина 1 sptSet .
  • Так sptSet тепер стає {0, 1}. Оновіть значення відстані суміжних вершин до 1.
  • Значення відстані вершини 2 стає 12 .
    4


крок 3:

  • Виберіть вершину з мінімальним значенням відстані, яка ще не включена SPT (не в sptSET ). Вибрано вершину 7. Так sptSet тепер стає {0, 1, 7}.
  • Оновіть значення відстані суміжних вершин 7. Значення відстані вершин 6 і 8 стає кінцевим ( 15 і 9 відповідно).
    5


крок 4:

  • Виберіть вершину з мінімальним значенням відстані, яка ще не включена SPT (не в sptSET ). Вибрано вершину 6. Так sptSet тепер стає {0, 1, 7, 6} .
  • Оновити значення відстані суміжних вершин 6. Значення відстані вершин 5 і 8 оновлено.
    3-(1)


Ми повторюємо описані вище дії до тих пір, поки sptSet включає в себе всі вершини даного графа. Нарешті, ми отримуємо наступне S hortest Path Tree (SPT).

2-(2)

Нижче наведено реалізацію вищезазначеного підходу:

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 і sptSet[y] == False і  dist[y]> dist[x] + self.graph[x][y]: dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Код драйвера, якщо __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) # Цей код створено Divyanshu Mehta та оновлено 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>

Вихід
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>

Часова складність: O(V2)
Допоміжний простір: O(V)

умовний оператор в java

Примітки:

  • Код обчислює найкоротшу відстань, але не обчислює інформацію про шлях. Створіть батьківський масив, оновіть батьківський масив, коли відстань оновлюється, і використовуйте його, щоб показати найкоротший шлях від джерела до різних вершин.
  • Час Складність виконання становить O(V 2 ) . Якщо вхід граф представлений за допомогою списку суміжності , його можна звести до O(E * log V) за допомогою двійкової купи. Будь ласка, подивіться Алгоритм Дейкстри для подання списку суміжності для більш детальної інформації.
  • Алгоритм Дейкстри не працює для графіків із негативними циклами ваги.

Чому алгоритм Дейкстри не працює для графіків з від’ємними ребрами?

Проблема з негативними вагами виникає через те, що алгоритм Дейкстри припускає, що як тільки вузол додається до набору відвіданих вузлів, його відстань остаточно визначена і не зміниться. Однак за наявності негативних ваг це припущення може призвести до неправильних результатів.

Для прикладу розглянемо наступний графік:

вираз регресії в java
Відмова-Дейкстри-у-випадку-негативних-країв

На наведеному вище графіку A є вихідним вузлом серед ребер А до Б і А до C , А до Б є меншою вагою, а Дейкстра призначає найкоротшу відстань Б як 2, але через наявність негативного краю від C до Б , фактична найкоротша відстань зменшується до 1, що Дейкстра не може визначити.

Примітка: Ми використовуємо Алгоритм найкоротшого шляху Беллмана Форда якщо ми маємо негативні ребра на графіку.

Використання алгоритму Дейкстри Список суміжності в O(E logV):

Для алгоритму Дейкстри завжди рекомендується використовувати Щоразу, коли відстань вершини зменшується, ми додаємо ще один екземпляр вершини в priority_queue. Навіть якщо існує кілька екземплярів, ми розглядаємо лише екземпляр із мінімальною відстанню та ігноруємо інші екземпляри.

  • Часова складність залишається O(E * LogV) оскільки в пріоритетній черзі буде щонайбільше O(E) вершин, а O(logE) дорівнює O(logV)
  • Нижче наведено реалізацію вищезазначеного підходу:

    C++
    // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Ціла пара typedef пара iPair; // Цей клас представляє орієнтований граф за допомогою // представлення списку суміжності class Graph { int V; // Кількість вершин // У зваженому графі нам потрібно зберегти вершину // і пару ваг для кожного списку ребер>* присл.; public: Graph(int V); // Конструктор // функція для додавання ребра до графіка void addEdge(int u, int v, int w);  // друкує найкоротший шлях із void shortestPath(int s); }; // Виділяє пам'ять для списку суміжності Graph::Graph(int V) { this->V = V;  adj = новий список [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)); } // Друкує найкоротші шляхи від src до всіх інших вершин void Graph::shortestPath(int src) { // Створення пріоритетної черги для зберігання вершин, які // попередньо обробляються. Це дивний синтаксис у C++.  // Перейдіть за посиланням нижче, щоб дізнатися більше про цей синтаксис // https://www.techcodeview.com priority_queue , більше > pq;  // Створіть вектор для відстаней та ініціалізуйте всі // відстані як нескінченний (INF) вектор dist(V, INF);  // Вставити сам джерело в чергу пріоритетів та ініціалізувати // його відстань як 0. pq.push(make_pair(0, src));  dist[src] = 0;  /* Цикл, поки пріоритетна черга не стане порожньою (або всі відстані не будуть остаточно визначені) */ while (!pq.empty()) { // Перша вершина в парі є мінімальною відстанню // вершиною, витягніть її з пріоритетної черги.  // мітка вершини зберігається у другій частині пари (це // має бути зроблено таким чином, щоб зберегти // відсортовану відстань між вершинами (відстань має бути першим елементом // у парі) int u = pq.top().second; pq.pop(); // 'i' використовується для отримання всіх суміжних вершин // списку вершин>::ітератор i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Отримати мітку вершини та вагу поточної // суміжної з u.  int v = (*i).first;  int weight = (*i).second;  // Якщо існує короткий шлях до v через u.  if (dist[v]> dist[u] + weight) { // Відстань оновлення v dist[v] = dist[u] + weight;  pq.push(make_pair(dist[v], v));  } } } // Друк найкоротших відстаней, збережених у dist[] printf('Відстань вершини від джерела
    ');  для (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> присл.;  Graph(int V) { this.V = V;  adj = новий ArrayList();  для (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 = новий int[V];  Arrays.fill(dist, Integer.MAX_VALUE);  pq.add(нова 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(нова iPair(dist[v.first], v.first));  } } } System.out.println('Відстань вершини від джерела');  для (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 ==>Пара цілих чисел iPair = tuple # Цей клас представляє орієнтований граф за допомогою # класу представлення списку суміжності Graph: def __init__(self, V: int): # Конструктор self.V = V self.adj = [[] for _ in range(V) )] def addEdge(self, u: int, v: int, w: int): self.adj[u].append((v, w)) self.adj[v].append((u, w)) # Друкує найкоротші шляхи від src до всіх інших вершин def shortestPath(self, src: int): # Створіть пріоритетну чергу для зберігання вершин, які # попередньо обробляються pq = [] heapq.heappush(pq, (0, src)) # Створіть вектор для відстаней та ініціалізуйте всі # відстані як нескінченні (INF) dist = [float('inf')] * self.V dist[src] = 0 while pq: # Перша вершина в парі є мінімальною відстанню # вершина, витягніть її з черги пріоритетів. # мітка вершини зберігається у другій частині пари d, u = heapq.heappop(pq) # 'i' використовується для отримання всіх суміжних вершин # вершини для v, вага в self.adj[u]: # Якщо існує короткий шлях до v через u. if dist[v]> dist[u] + weight: # Оновлення відстані для v dist[v] = dist[u] + weight heapq.heappush(pq, (dist[v], v)) # Друк найкоротших відстаней, збережених у dist[] for i in range(self.V): print(f'{i} 		 {dist[i]}') # Код драйвера if __name__ == '__main__': # створити графік, наведений на малюнку вище V = 9 g = 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)>
    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 [] присл.;  public Graph(int V) { // Кількість вершин this.V = V;  // У зваженому графі нам потрібно зберегти вершину // і пару ваг для кожного ребра this.adj = new List [V];  для (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 });  } // Друкує найкоротші шляхи від src до всіх інших вершин public void ShortestPath(int src) { // Створення пріоритетної черги для зберігання вершин, які // попередньо обробляються.  Відсортований набір pq = новий відсортований набір (новий DistanceComparer());  // Створити масив для відстаней та ініціалізувати всі // відстані як нескінченні (INF) int[] dist = new int[V];  для (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) { // Перша вершина в парі є мінімальною відстанню // вершина, витягніть її з пріоритетної черги.  // мітка вершини зберігається у другій частині пари (це // має бути зроблено таким чином, щоб вершини // були відсортовані за відстанню) int[] minDistVertex = pq.Min;  pq.Remove(minDistVertex);  int u = minDistVertex[1];  // 'i' використовується для отримання всіх суміжних вершин // вершини foreach (int[] adjVertex in this.adj[u]) { // Отримання мітки вершини та ваги поточної // суміжної з u.  int v = adjVertex[0];  int weight = adjVertex[1];  // Якщо є коротший шлях до v через u.  if (dist[v]> dist[u] + weight) { // Відстань оновлення v dist[v] = dist[u] + weight;  pq.Add(new int[] { dist[v], v });  } } } // Друк найкоротших відстаней, збережених у dist[] Console.WriteLine('Відстань вершини від джерела');  для (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];  } return x[0] - y[0];  } } } public class Program { // Код драйвера public static void Main() { // створити графік, наведений на малюнку вище int V = 9;  Графік g = новий графік (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);  } } // цей код створено 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) { // Перша вершина в парі є мінімальною відстанню // вершина, витягніть її з пріоритетної черги.  // мітка вершини зберігається у другій частині пари (це // має бути зроблено таким чином, щоб зберегти // відсортовану відстань між вершинами (відстань має бути першим елементом // у парі) let u = pq[0][1]; pq.shift(); // 'i' використовується для отримання всіх суміжних вершин // вершини for(let i = 0; i< this.adj[u].length; i++){    // Get vertex label and weight of current  // adjacent of u.  let v = this.adj[u][i][0];  let weight = this.adj[u][i][1];  // If there is shorted path to v through u.  if (dist[v]>dist[u] + weight) { // Відстань оновлення v dist[v] = dist[u] + weight;  pq.push([dist[v], v]);  pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; });  } } } // Друк найкоротших відстаней, збережених у dist[] console.log('Відстань вершини від джерела');  для (нехай 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.>

    Вихід
    Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>

    Часова складність: O(E * logV), де E — кількість ребер, а V — кількість вершин.
    Допоміжний простір: O(V)

    Застосування алгоритму Дейкстри:

    • Гугл-мапи використовує алгоритм Дейкстри, щоб показати найкоротшу відстань між джерелом і пунктом призначення.
    • в комп'ютерні мережі , алгоритм Дейкстри є основою для різних протоколів маршрутизації, таких як OSPF (спершу відкрити найкоротший шлях) і IS-IS (проміжна система до проміжної системи).
    • Системи керування транспортом і дорожнім рухом використовують алгоритм Дейкстри для оптимізації транспортного потоку, мінімізації заторів і планування найбільш ефективних маршрутів для транспортних засобів.
    • Авіакомпанії використовують алгоритм Дейкстри для планування маршрутів польоту, які мінімізують споживання палива, скорочують час у дорозі.
    • Алгоритм Дейкстри використовується в автоматизованому проектуванні електроніки для маршрутизації з’єднань на інтегральних схемах і мікросхемах дуже великої інтеграції (VLSI).

    Для більш детального пояснення зверніться до цієї статті Алгоритм найкоротшого шляху Дейкстри з використанням priority_queue STL .