Confus de choisir le chemin le plus court entre votre emplacement et votre destination…. Alors, vous devriez connaître cet algorithme.
- L’algorithme de Floyd-Warshall est utilisé pour trouver les chemins les plus courts entre toutes les paires de sommets dans un graphe, où chaque arête du graphe a un poids qui est positif ou négatif.
- Le plus grand avantage de l’utilisation de cet algorithme est que toutes les plus courtes distances entre 2 sommets quelconques pourraient être calculées en O(V3), où V est le nombre de sommets dans un graphe.
- L’algorithme de Floyd-Warshall est également appelé algorithme de Floyd, algorithme de Roy-Floyd, algorithme de Roy-Warshall ou algorithme WFI.
- Cet algorithme suit l’approche de programmation dynamique pour trouver les plus courts chemins.
Algorithme
Pour un graphe à N sommets :
Etape 1 : Initialiser les plus courts chemins entre 2 sommets quelconques avec Infini.
Etape 2 : Trouver tous les plus courts chemins par paire qui utilisent 0 sommet intermédiaire, puis trouver les plus courts chemins qui utilisent 1 sommet intermédiaire et ainsi de suite… jusqu’à utiliser tous les N sommets comme nœuds intermédiaires.
Étape 3 : Minimiser les plus courts chemins entre 2 paires quelconques dans l’opération précédente.
Étape 4 : Pour 2 sommets quelconques (i,j) , il faut en fait minimiser les distances entre cette paire en utilisant les K premiers nœuds, donc le plus court chemin sera : min(dist+dist,dist).
dist représente le plus court chemin qui utilise seulement les K premiers sommets, dist représente le plus court chemin entre la paire k,j. Comme le plus court chemin sera une concaténation du plus court chemin de i à k, puis de k à j.
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
dist = min( dist, dist + dist );
}
}
}
Exemple
Disons que le graphe donné est :
![](https://miro.medium.com/max/60/0*_xHqSgP179ftnEPB.png?q=20)
Suivons les étapes ci-dessous pour trouver le plus court chemin entre toutes les paires de sommets.
- Créer une matrice
A0
de dimensionn*n
où n est le nombre de sommets. La ligne et la colonne sont indexées respectivement i et j. i et j sont les sommets du graphe.
Chaque cellule A est remplie avec la distance du sommet ith
au sommet jth
. S’il n’y a pas de chemin du sommet ith
au sommet jth
, la cellule est laissée à l’infini.
![](https://miro.medium.com/max/60/0*zHEY97R1MtB27HdE.png?q=20)
2. Maintenant, créez une matrice A1
en utilisant la matrice A0
. Les éléments de la première colonne et de la première ligne sont laissés tels quels. Les cellules restantes sont remplies de la manière suivante.
Laissez k être le sommet gelé dans le plus court chemin de la source à la destination. Dans cette étape, k est le premier sommet.A
est rempli avec (A + A) if (A > A + A)
.
C’est-à-dire que si la distance directe de la source à la destination est plus grande que le chemin passant par le sommet k, alors la cellule est remplie avec A + A
.
Dans cette étape, k est le sommet 1. On calcule la distance du sommet source au sommet destination en passant par ce sommet k.
![](https://miro.medium.com/max/60/0*7vlvb6dwy2m_uFJZ.png?q=20)
Par exemple : Pour A1
, la distance directe du sommet 2 au 4 est 4 et la somme de la distance du sommet 2 au 4 en passant par le sommet (c’est-à-dire du sommet 2 au 1 et du sommet 1 au 4) est 7. Depuis 4 < 7
, A0
est rempli avec 4.
3. De la même manière, A2
est créé en utilisant A3
. Les éléments de la deuxième colonne et de la deuxième ligne sont laissés tels quels.
Dans cette étape, k est le deuxième sommet (c’est-à-dire le sommet 2). Les autres étapes sont les mêmes que celles de l’étape 2.
![](https://miro.medium.com/max/60/0*pnBDaBhEWy5JsZLr.png?q=20)
4. De même, A3
et A4
est également créé.
![](https://miro.medium.com/max/60/0*FDEA0qgqrEcYazxl.png?q=20)
![](https://miro.medium.com/max/60/0*k9Z0IpZfY9ORKYiV.png?q=20)
A4
donne le plus court chemin entre chaque paire de sommets.
Confus de sélectionner le plus court chemin, puis d’utiliser le code ci-dessous pour le trouver. Mais entrez les distances correctes.
Complexité temporelle
Il y a trois boucles. Chaque boucle a des complexités constantes. Donc, la complexité temporelle de l’algorithme de Floyd-Warshall est O(n3).
Complexité spatiale
La complexité spatiale de l’algorithme de Floyd-Warshall est O(n2).