Prérequis
Afin de comprendre le fonctionnement de l’algorithme de Johnson, il est nécessaire de connaître deux autres algorithmes de plus court chemin :
Idée de l’algorithme
- Ajout d’un sommet : Nous ajoutons un sommet au graphe ainsi que arrêtes reliant à chaque sommet de .
- Nous utilisons l’algorithme de Bellman-Ford depuis vers tous les autres sommets de . nous donne la distance entre et Si Bellman-Ford détecte un cycle absorbant, l’algorithme s’arrête.
- Suppression du sommet : Ce sommet n’est désormait plus utile. Supprimez ce sommet ainsi que toutes les arrêtes ajoutées à l’étape 1.
- Repondérons les arcs du graphe : Pour chaque arrête du graphe, faire : .
- Calcul du plus court chemin. Pour chaque sommet de , appliquez l’algorithme de Dijkstra afin de déterminer le plus court chemin entre tous les sommets.
Il faut bien prendre en compte que les distances ne sont pas conservées. Si pour un arcs, nous avions un poids de , le nouveau poids sera . Cependant, ce n’est pas le propos. L’algorithme de Johnson nous donne le plus court chemin d’un points à un points “uniquement”. Si vous avez besoin de récupérer la somme des poids de ce chemin, il suffit de retourner dans le graphe initial et de suivre le chemin donnée par Johnson.
Algorithme / Correction / Complexité
Cet article présente seulement un exemple d’application de l’algorithme de Johnson. Vous pouvez cependant facilement trouver ces informations sur internet :
Exemple :
Soit un graphe avec des arcs de poids négatif.

Etape 1 - Ajout du sommet w

Etape 2 - Plus courts chemins entre w et les autres sommets avec Bellman-Ford

En violet les résultats de l’algorithmes de Bellman-Ford.
Etape 3 et 4 - Repondération des arcs

Etape 5 - Algorithme de Dijkstra sur tout les arcs
Nous avons au final le graphe suivant :

L’étape 5 est uniquement une application de l’algorithme de Dijkstra. Un exemple d’utilisation est déja détaillé sur ce site : Algorithme de Dijkstra - Exemple.
Pour prendre plusieurs résultats de l’algorithme de Dijkstra :
- Pour aller de a à d, le chemin à prendre est de poids -9 (et non 0, il faut prendre les poids de et pas de ).
- Pour aller de f à d, le chemin à prendre est de poids -2.
- Pour aller de d à e, il n’existe pas de chemin possible.
Le reste sera laissé en exercice pour le lecteur.