Aller au contenu principal

Plus courts chemins (Dijkstra)

Progression

#Plus courts chemins — Dijkstra

À quoi ça sert ?

À quoi ça sert: trouver les plus courts chemins depuis une source quand les poids sont non négatifs. Comment: exploration par distances croissantes avec une file de priorité; alternatives si poids négatifs (Bellman‑Ford) ou heuristique (A*).

Objectifs d’apprentissage

  • Comprendre la relaxation, l’invariant de l’exploration par distances croissantes.
  • Utiliser une file de priorité et éviter les mises à jour coûteuses (technique des entrées « outdated »).
  • Identifier les limites: poids négatifs, graphes denses, variantes multi‑sources.

#Principe

L’algorithme maintient une distance minimale dist[u] pour chaque sommet, initialisée à l’infini sauf pour la source. Une file de priorité ordonne les sommets par coût croissant. À chaque itération, on extrait le sommet de coût minimal et on tente d’améliorer (« relaxer ») ses voisins. Le procédé se répète jusqu’à explorer tous les sommets atteignables; si l’on cherche uniquement un but t, on peut s’arrêter dès que t est extrait de la file: sa distance est alors optimale.

#Visualisation interactive

Chargement...

#Animation: déroulé conceptuel

Init
dist[src]=0 ; autres=∞ ; PQ=(0,src)
Extraire min
Sommet coût min ; ignorer les entrées outdated
Relaxer
Si d(u)+w < dist[v] → MAJ + push(pq)
Répéter
Jusqu’à vider la PQ ; prev reconstitue le chemin

#Implémentation (Python)

pythonpython
1import heapq2 3def dijkstra(graph, start):4    # graph: dict[str, dict[str, int]]  ex: {'A': {'B':1,'C':4}, 'B': {'C':2}}5    INF = 10**186    dist = {u: INF for u in graph}7    prev = {u: None for u in graph}8    dist[start] = 09    pq = [(0, start)]10 11    while pq:12        d, u = heapq.heappop(pq)13        if d != dist[u]:14            continue
Chargement de l’éditeur...

#Complexité

Avec un tas binaire, la complexité est O((V+E) log V). Sur graphe dense, une variante sans tas donne O(V^2) et reste acceptable. En théorie, un tas de Fibonacci permet O(E + V log V), mais l’overhead le rend peu attractif en pratique.

Attention aux poids négatifs

Dijkstra n’est pas valide si des arêtes ont des poids négatifs (utiliser Bellman–Ford).

#Pièges et variantes

  • Multi‑sources: initialiser la PQ avec toutes les sources à 0.
  • Densité élevée: un tableau des distances + choix naïf donne O(V^2) acceptable sur petits graphes denses.
  • Graphes orientés vs non orientés: bien définir les arêtes; ne pas doubler par erreur.

#Mini‑quiz

Quel cas invalide Dijkstra ?
Quel cas invalide Dijkstra ?