Dijkstra à la main, puis en machine
Exercice d'entraînement · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Graphes
Énoncé
Soit le graphe pondéré d'arêtes , , , , , , . Dérouler l'algorithme de Dijkstra depuis en notant les distances provisoires à chaque étape, puis vérifier le résultat en Python.
Corrigé
Le déroulé. On note une distance encore inconnue ; à chaque étape on fixe le sommet non traité de plus petite distance provisoire (encadré ci-dessous par des crochets), puis on met à jour ses voisins.
| étape | on fixe | |||||
|---|---|---|---|---|---|---|
| départ | ||||||
| après | ||||||
| après | ||||||
| après | ||||||
| après |
Les deux mises à jour intéressantes. Après avoir fixé , la distance de passe de à : le détour coûte , moins que l'arête directe . De même, après , la distance de passe de à , car coûte contre par .
Distances finales. , , , , .
La vérification en Python.
def dijkstra(G, source):
dist = {s: float("inf") for s in G}
dist[source] = 0
a_traiter = set(G)
while a_traiter:
u = min(a_traiter, key=lambda s: dist[s])
if dist[u] == float("inf"):
break
a_traiter.remove(u)
for v, poids in G[u]:
if dist[u] + poids < dist[v]:
dist[v] = dist[u] + poids
return dist
G = {"A": [("B", 2), ("C", 5)],
"B": [("A", 2), ("C", 1), ("D", 4)],
"C": [("A", 5), ("B", 1), ("D", 1), ("E", 8)],
"D": [("B", 4), ("C", 1), ("E", 3)],
"E": [("C", 8), ("D", 3)]}
print(dijkstra(G, "A"))
# {'A': 0, 'B': 2, 'C': 3, 'D': 4, 'E': 7}
Ce que l'exemple illustre. Le plus court chemin vers emprunte quatre arêtes () alors qu'un chemin de deux arêtes existe (, de longueur ) : le plus court n'est pas celui qui compte le moins d'arêtes.
Un graphe non orienté se saisit deux fois. Chaque arête apparaît dans la liste des deux extrémités. L'oublier revient à orienter le graphe sans le vouloir, et peut rendre certains sommets inatteignables.
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.