Adloun

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.

étapeon 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.