Un poids négatif, et Dijkstra se trompe
Exercice · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Graphes et plus courts chemins
Énoncé
Construire un graphe orienté à quatre sommets, dont une arête porte un poids négatif, sur lequel l'algorithme de Dijkstra du cours renvoie une distance fausse. Dire à quel moment précis il conclut trop tôt.
Corrigé
G = {"A": [("B", 2), ("C", 3)],
"B": [("D", 5)],
"C": [("B", -2)],
"D": []}
print(dijkstra(G, "A")) # {'A': 0, 'B': 1, 'C': 3, 'D': 7}
La vraie réponse. Le chemin coûte , alors que l'algorithme annonce pour .
Le moment exact de l'erreur. Après le traitement de , on a et . L'étape suivante fixe le sommet de plus petite distance provisoire, donc , et relâche aussitôt son arête sortante : . Vient ensuite , qui propose pour . Mais est déjà sorti de l'ensemble des sommets à traiter : son arête ne sera plus jamais réexaminée, et garde les calculés sur une valeur périmée.
Le piège dans le piège. Le dictionnaire rendu affiche à , la bonne valeur — c'est , plus loin, qui est faux. Contrôler seulement le sommet qu'atteint l'arête négative ne montrerait rien.
Ce que l'hypothèse garantissait. Avec des poids positifs, tout chemin passant par un sommet non encore fixé coûte au moins la distance provisoire de ce sommet, donc au moins celle du minimum : le fixer est sûr, sa distance ne baissera plus, et ce qu'il a propagé reste valable. Un poids négatif fait disparaître exactement ce « au moins ».
Le point à retenir. La mention « poids positifs » n'est pas une précaution de rédaction : c'est l'hypothèse sur laquelle repose la correction de l'algorithme, et il échoue sans rien signaler.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.