| Découvreur ou inventeur | |
|---|---|
| Date de découverte | |
| Problèmes liés | |
| Structure des données |
| Pire cas | |
|---|---|
| Moyenne | |
| Meilleur cas |
| Pire cas |
|---|
En informatique, l'algorithme de Floyd-Warshall est un algorithme pour déterminer les distances des plus courts chemins entre toutes les paires de sommets dans un graphe orienté et pondéré, en temps cubique au nombre de sommets. Il est parfois appelé algorithme de Roy-Floyd-Warshall car il a été décrit par Bernard Roy en 1959 avant la parution des articles de Floyd et Warshall datant de 1962.
L'algorithme de Floyd-Warshall prend en entrée un graphe orienté et valué, décrit par une matrice d'adjacence donnant le poids d'un arc lorsqu'il existe et la valeur ∞ sinon. Le poids d'un chemin entre deux sommets est la somme des poids sur les arcs constituant ce chemin. Les arcs du graphe peuvent avoir des poids négatifs, mais le graphe ne doit pas posséder de circuit de poids strictement négatif. L'algorithme calcule, pour chaque paire de sommets, le poids minimal parmi tous les chemins entre ces deux sommets.
L'algorithme de Floyd-Warshall est un exemple de programmation dynamique. Soit un graphe à sommets avec . Il résout successivement les sous-problèmes suivants :
est le poids minimal d'un chemin du sommet au sommet n'empruntant que des sommets intermédiaires dans s'il en existe un, et sinon.
On note la matrice des . Pour , est la matrice d'adjacence définissant . Maintenant, pour trouver une relation de récurrence, on considère un chemin entre et de poids minimal dont les sommets intermédiaires sont dans . De deux choses l'une :
L'observation ci-dessus donne la relation de récurrence , pour tous , et dans . Ainsi on résout les sous-problèmes par valeur de croissante.
Donnons d'abord une première version d'après l'analyse faite dans la section précédente. Le pseudo-code suivant effectue ce calcul :
fonction FloydWarshall () matrice d'adjacence de (matrice ) for to for to for to renvoyer
On peut optimiser l'algorithme en effectuant le calcul en place dans une unique matrice . Le pseudo-code suivant effectue ce calcul :
fonction FloydWarshall () matrice d'adjacence de (matrice ) for to for to for to renvoyer
La complexité en temps, dans le pire cas, de cet algorithme (deuxième version) est et sa complexité en espace .
L'algorithme est exécuté sur le graphe à gauche.
L'algorithme de Floyd-Warshall peut être utilisé dans les situations suivantes :
En 1993, Bahar et coll. ont donné une implémentation de l'algorithme de Floyd-Warshall pour des graphes représentés symboliquement à l'aide d'une structure de données appelée diagramme de décision algébriques qui est une généralisation des diagrammes de décision binaire.