Étant donné un graphique pondéré et un sommet source dans le graphique, trouvez le chemins les plus courts de la source à tous les autres sommets du graphe donné.
Note: Le graphique donné ne contient aucun bord négatif.
Exemples:
Pratique recommandée Implémentation de l'algorithme Dijkstra Essayez-le !Saisir: src = 0, le graphique est présenté ci-dessous.
Sortir: 0 4 12 19 21 11 9 8 14
Explication: La distance de 0 à 1 = 4.
La distance minimale de 0 à 2 = 12. 0->1->2
La distance minimale de 0 à 3 = 19. 0->1->2->3
La distance minimale de 0 à 4 = 21. 0->7->6->5->4
La distance minimale de 0 à 5 = 11. 0->7->6->5
La distance minimale de 0 à 6 = 9. 0->7->6
La distance minimale de 0 à 7 = 8. 0->7
La distance minimale de 0 à 8 = 14. 0->1->2->8
Algorithme de Dijkstra utilisant Matrice de contiguïté :
L'idée est de générer un SPT (arbre du chemin le plus court) avec une source donnée comme racine. Maintenir une matrice de contiguïté avec deux ensembles,
- un ensemble contient des sommets inclus dans l'arbre du chemin le plus court,
- un autre ensemble comprend des sommets qui ne sont pas encore inclus dans l'arborescence du chemin le plus court.
À chaque étape de l'algorithme, recherchez un sommet qui se trouve dans l'autre ensemble (ensemble non encore inclus) et qui a une distance minimale de la source.
programme matriciel en langage C
Algorithme :
- Créer un ensemble sptSet (ensemble d'arbres de chemins les plus courts) qui garde la trace des sommets inclus dans l'arbre de chemins les plus courts, c'est-à-dire dont la distance minimale par rapport à la source est calculée et finalisée. Initialement, cet ensemble est vide.
- Attribuez une valeur de distance à tous les sommets du graphique d’entrée. Initialisez toutes les valeurs de distance comme INFINI . Attribuez la valeur de distance à 0 pour le sommet source afin qu'il soit sélectionné en premier.
- Alors que sptSet n'inclut pas tous les sommets
- Choisissez un sommet dans ce n'est pas là dans sptSet et a une valeur de distance minimale.
- Incluez-vous à sptSet .
- Mettez ensuite à jour la valeur de distance de tous les sommets adjacents de dans .
- Pour mettre à jour les valeurs de distance, parcourez tous les sommets adjacents.
- Pour chaque sommet adjacent dans, si la somme de la valeur de distance de dans (de la source) et poids du bord u-v , est inférieur à la valeur de distance de dans , puis mettez à jour la valeur de distance de dans .
Note: Nous utilisons un tableau booléen sptSet[] pour représenter l'ensemble des sommets inclus dans SPT . Si une valeur sptSet[v] est vrai, alors le sommet v est inclus dans SPT , sinon non. Tableau dist[] est utilisé pour stocker les valeurs de distance les plus courtes de tous les sommets.
Illustration de l'algorithme de Dijkstra :
Pour comprendre l'algorithme de Dijkstra, prenons un graphique et trouvons le chemin le plus court de la source à tous les nœuds.
Considérez le graphique ci-dessous et src = 0
Étape 1:
liste de tableaux triée en Java
- L'ensemble sptSet est initialement vide et les distances assignées aux sommets sont {0, INF, INF, INF, INF, INF, INF, INF} où INF indique l'infini.
- Choisissez maintenant le sommet avec une valeur de distance minimale. Le sommet 0 est choisi, incluez-le dans sptSet . Donc sptSet devient {0}. Après avoir inclus 0 à sptSet , met à jour les valeurs de distance de ses sommets adjacents.
- Les sommets adjacents de 0 sont 1 et 7. Les valeurs de distance de 1 et 7 sont mises à jour comme 4 et 8.
Le sous-graphique suivant montre les sommets et leurs valeurs de distance, seuls les sommets avec des valeurs de distance finies sont affichés. Les sommets inclus dans SPT sont présentés dans vert couleur.
Étape 2:
- Choisissez le sommet avec une valeur de distance minimale et qui n'est pas déjà inclus dans SPT (pas dedans sptSET ). Le sommet 1 est choisi et ajouté à sptSet .
- Donc sptSet devient maintenant {0, 1}. Mettez à jour les valeurs de distance des sommets adjacents de 1.
- La valeur de distance du sommet 2 devient 12 .
Étape 3:
- Choisissez le sommet avec une valeur de distance minimale et qui n'est pas déjà inclus dans SPT (pas dedans sptSET ). Le sommet 7 est choisi. Donc sptSet devient maintenant {0, 1, 7}.
- Mettez à jour les valeurs de distance des sommets adjacents de 7. La valeur de distance des sommets 6 et 8 devient finie ( 15 et 9 respectivement).
Étape 4:
- Choisissez le sommet avec une valeur de distance minimale et qui n'est pas déjà inclus dans SPT (pas dedans sptSET ). Le sommet 6 est choisi. Donc sptSet devient maintenant {0, 1, 7, 6} .
- Mettez à jour les valeurs de distance des sommets adjacents de 6. Les valeurs de distance des sommets 5 et 8 sont mises à jour.
Nous répétons les étapes ci-dessus jusqu'à ce que sptSet comprend tous les sommets du graphe donné. Finalement, on obtient le S suivant Arbre de chemin le plus court (SPT).
Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :
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 et sptSet[y] == False et dist[y]> dist[x] + self.graph[x][y] : dist[y] = dist[x] + self.graph[x][y] self.printSolution(dist) # Code du pilote si __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) # Ce code est contribué par Divyanshu Mehta et mis à jour par 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> Sortir
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Complexité temporelle : O(V2)
Espace auxiliaire : O(V)
Remarques:
- Le code calcule la distance la plus courte mais ne calcule pas les informations sur le chemin. Créez un tableau parent, mettez à jour le tableau parent lorsque la distance est mise à jour et utilisez-le pour afficher le chemin le plus court de la source aux différents sommets.
- La complexité temporelle de la mise en œuvre est O(V 2 ) . Si l'entrée le graphique est représenté à l'aide d'une liste de contiguïté , il peut être réduit à O(E * log V) à l'aide d'un tas binaire. S'il te plait regarde Algorithme de Dijkstra pour la représentation de liste de contiguïté pour plus de détails.
- L’algorithme de Dijkstra ne fonctionne pas pour les graphiques avec des cycles de poids négatifs.
Pourquoi les algorithmes de Dijkstra échouent pour les graphes à bords négatifs ?
Le problème des poids négatifs vient du fait que l’algorithme de Dijkstra suppose qu’une fois qu’un nœud est ajouté à l’ensemble des nœuds visités, sa distance est finalisée et ne changera pas. Cependant, en présence de poids négatifs, cette hypothèse peut conduire à des résultats incorrects.
python, tri des tuples
Considérons le graphique suivant à titre d'exemple :

Dans le graphique ci-dessus, A est le nœud source, parmi les arêtes UN à B et UN à C , UN à B est le poids le plus petit et Dijkstra attribue la distance la plus courte de B comme 2, mais en raison de l'existence d'un front négatif de C à B , la distance réelle la plus courte se réduit à 1, ce que Dijkstra ne parvient pas à détecter.
Note: Nous utilisons Algorithme du plus court chemin de Bellman Ford au cas où nous aurions des bords négatifs dans le graphique.
Algorithme de Dijkstra utilisant Liste de contiguïté en O(E logV) :
Pour l’algorithme de Dijkstra, il est toujours recommandé d’utiliser Chaque fois que la distance d'un sommet est réduite, nous ajoutons une instance supplémentaire d'un sommet dans priorité_queue. Même s'il existe plusieurs instances, nous considérons uniquement l'instance avec une distance minimale et ignorons les autres instances.
La complexité temporelle demeure O(E * LogV) car il y aura au plus des sommets O(E) dans la file d'attente prioritaire et O(logE) est identique à O(logV)
Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :
C++ // C++ Program to find Dijkstra's shortest path using // priority_queue in STL #include using namespace std; #define INF 0x3f3f3f3f // iPair ==>Paire de types de paires entières iPaire ; // Cette classe représente un graphe orienté en utilisant // la classe de représentation de liste de contiguïté Graph { int V; // Nombre de sommets // Dans un graphe pondéré, nous devons stocker le sommet // et la paire de poids pour chaque liste d'arêtes>* adj; public : Graphique (int V ); // Constructeur // fonction pour ajouter une arête au graphique void addEdge(int u, int v, int w); // affiche le chemin le plus court depuis s void shortPath(int s); } ; // Alloue de la mémoire pour la liste de contiguïté Graph::Graph(int V) { this->V = V; adj = nouvelle 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)); } // Imprime les chemins les plus courts de src vers tous les autres sommets void Graph::shortestPath(int src) { // Crée une file d'attente prioritaire pour stocker les sommets qui // sont en cours de prétraitement. C'est une syntaxe étrange en C++. // Reportez-vous au lien ci-dessous pour plus de détails sur cette syntaxe // https://www.techcodeview.com priorité_queue , plus grand > pq; // Crée un vecteur pour les distances et initialise toutes // les distances en tant que vecteur infini (INF) dist(V,INF); // Insère la source elle-même dans la file d'attente prioritaire et initialise // sa distance à 0. pq.push(make_pair(0, src)); dist[src] = 0; /* Boucle jusqu'à ce que la file d'attente prioritaire soit vide (ou que toutes les distances ne soient pas finalisées) */ while (!pq.empty()) { // Le premier sommet de la paire est la distance minimale // le sommet, extrayez-le de la file d'attente prioritaire. // l'étiquette du sommet est stockée dans la seconde de la paire (cela // doit être fait de cette façon pour conserver les sommets // la distance triée (la distance doit être le premier élément // de la paire) int u = pq.top().second; pq.pop(); // 'i' est utilisé pour obtenir tous les sommets adjacents d'une // liste de sommets>::itérateur i ; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Récupère l'étiquette du sommet et le poids du courant // adjacent à u. int v = (*i).premier; int poids = (*i).seconde; // S'il existe un chemin raccourci vers v via u. if (dist[v]> dist[u] + poids) { // Mise à jour de la distance de v dist[v] = dist[u] + poids; pq.push(make_pair(dist[v], v)); } } } // Imprimer les distances les plus courtes stockées dans dist[] printf('Distance du sommet depuis la source
'); pour (int je = 0; je< 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; Graphique(int V) { this.V = V; adj = new ArrayList(); pour (int je = 0; je< 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 = nouveau int[V]; Arrays.fill(dist, Integer.MAX_VALUE); pq.add(new 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(new iPair(dist[v.first], v.first)); } } } System.out.println('Distance du sommet par rapport à la source'); pour (int je = 0; je< 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 ==>Paire entière iPair = tuple # Cette classe représente un graphe orienté utilisant # classe de représentation de liste de contiguïté Graph : def __init__(self, V: int) : # Constructeur 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)) # Imprime les chemins les plus courts de src vers tous les autres sommets def shortPath(self, src: int): # Crée une file d'attente prioritaire pour stocker les sommets qui # sont en cours de prétraitement pq = [] heapq.heappush(pq, (0, src)) # Créez un vecteur pour les distances et initialisez toutes les # distances comme infinies (INF) dist = [float('inf')] * self.V dist[src] = 0 while pq : # Le premier sommet de la paire est la distance minimale # sommet, extrayez-le de la file d'attente prioritaire. # L'étiquette du sommet est stockée dans la seconde de la paire d, u = heapq.heappop(pq) # 'i' est utilisé pour obtenir tous les sommets adjacents d'un # sommet pour v, poids dans self.adj[u] : # Si il y a un chemin raccourci vers v via u. if dist[v]> dist[u] + poids : # Mise à jour de la distance de v dist[v] = dist[u] + poids heapq.heappush(pq, (dist[v], v)) # Imprimer les distances les plus courtes stockées dans dist[] for i in range(self.V): print(f'{i} {dist[i]}') # Code du pilote si __name__ == '__main__' : # créer le graphique donné dans la figure ci-dessus V = 9 g = Graph(V) # créer le graphique ci-dessus 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) { // Nombre de sommets this.V = V; // Dans un graphe pondéré, nous devons stocker le sommet // et la paire de poids pour chaque arête this.adj = new List [V] ; pour (int je = 0; je< 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 }); } // Imprime les chemins les plus courts de src vers tous les autres sommets public void ShortestPath(int src) { // Crée une file d'attente prioritaire pour stocker les sommets qui // sont en cours de prétraitement. Ensemble trié pq = nouveau SortedSet (nouveau DistanceComparer()); // Crée un tableau pour les distances et initialise toutes // les distances comme infinies (INF) int[] dist = new int[V]; pour (int je = 0; je< 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) { // Le premier sommet de la paire est la distance minimale // du sommet, extrayez-le de la file d'attente prioritaire. // l'étiquette du sommet est stockée dans la seconde de la paire (cela // doit être fait de cette façon pour conserver les sommets // triés par distance) int[] minDistVertex = pq.Min; pq.Remove(minDistVertex); int u = minDistVertex[1]; // 'i' est utilisé pour obtenir tous les sommets adjacents d'un // sommet pour chaque (int[] adjVertex in this.adj[u]) { // Obtenir l'étiquette du sommet et le poids du // courant adjacent à u. int v = adjVertex[0]; int poids = adjVertex[1]; // S'il existe un chemin plus court vers v via u. if (dist[v]> dist[u] + poids) { // Mise à jour de la distance de v dist[v] = dist[u] + poids; pq.Add(new int[] { dist[v], v }); } } } // Imprimer les distances les plus courtes stockées dans dist[] Console.WriteLine('Vertex Distance from Source'); pour (int je = 0; je< 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]; } renvoie x[0] - y[0]; } } } public class Program { // Code du pilote public static void Main() { // crée le graphique donné dans la figure ci-dessus int V = 9; Graphique g = nouveau graphique (V); // création du graphique ci-dessus 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); } } // ce code est fourni par 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) { // Le premier sommet de la paire est la distance minimale // du sommet, extrayez-le de la file d'attente prioritaire. // l'étiquette du sommet est stockée dans la seconde de la paire (cela // doit être fait de cette façon pour conserver les sommets // la distance triée (la distance doit être le premier élément // de la paire) let u = pq[0][1]; pq.shift(); // 'i' est utilisé pour obtenir tous les sommets adjacents d'un // sommet pour (soit 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] + poids) { // Mise à jour de la distance de v dist[v] = dist[u] + poids; pq.push([dist[v], v]); pq.sort((a, b) =>{ if(a[0] == b[0]) return a[1] - b[1]; return a[0] - b[0]; }); } } } // Imprimer les distances les plus courtes stockées dans dist[] console.log('Vertex Distance from Source'); pour (soit 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.> Sortir
Vertex Distance from Source 0 0 1 4 2 12 3 19 4 21 5 11 6 9 7 8 8 14>
Complexité temporelle : O(E * logV), où E est le nombre d'arêtes et V est le nombre de sommets.
Espace auxiliaire : O(V)
Applications de l’algorithme de Dijkstra :
- Google Maps utilise l'algorithme de Dijkstra pour afficher la distance la plus courte entre la source et la destination.
- Dans réseaux informatiques , l'algorithme de Dijkstra constitue la base de divers protocoles de routage, tels que OSPF (Open Shortest Path First) et IS-IS (Intermediate System to Intermediate System).
- Les systèmes de transport et de gestion du trafic utilisent l’algorithme de Dijkstra pour optimiser la fluidité du trafic, minimiser les embouteillages et planifier les itinéraires les plus efficaces pour les véhicules.
- Les compagnies aériennes utilisent l'algorithme de Dijkstra pour planifier des trajectoires de vol qui minimisent la consommation de carburant et réduisent le temps de trajet.
- L'algorithme de Dijkstra est appliqué à l'automatisation de la conception électronique pour le routage des connexions sur les circuits intégrés et les puces d'intégration à très grande échelle (VLSI).
Pour une explication plus détaillée, reportez-vous à cet article L'algorithme du plus court chemin de Dijkstra utilisant la file d'attente prioritaire de STL .





