Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Calculateur de chemins à arêtes négatives
Trouve les plus courts chemins, gère les poids négatifs
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
L'algorithme de Bellman-Ford résout le problème du plus court chemin à source unique dans les graphes pouvant contenir des poids d'arêtes négatifs, ce que Dijkstra ne gère pas. Il détecte aussi les cycles négatifs, dont le poids total est inférieur à zéro et qui rendent les plus courts chemins indéfinis.
Bellman-Ford relâche chaque arête du graphe V moins 1 fois, où V est le nombre de sommets. Chaque passe propage les distances les plus courtes correctes d'un saut de plus, si bien qu'après V moins 1 passes tous les plus courts chemins d'au plus V moins 1 arêtes sont définitifs. Une passe finale supplémentaire vérifie si une arête peut encore être relâchée ; si oui, le graphe contient un cycle négatif atteignable depuis la source. Le temps est O(VE), plus lent que Dijkstra mais bien plus général.
Bellman-Ford est utilisé dans les protocoles de routage à vecteur de distance comme RIP, dans la détection d'arbitrage de devises où les taux de change deviennent des poids logarithmiques négatifs, et dans tout problème de planification à coûts négatifs. Les questions d'entretien testent souvent si les candidats savent quand Dijkstra échoue et que Bellman-Ford s'impose.
Bellman-Ford est l'algorithme de plus court chemin qui échange l'astuce contre la généralité. Ni file de priorité ni décision d'ordre, seulement le relâchement répété de toutes les arêtes.
BellmanFord(graphe, source):
pour chaque sommet v: dist[v] = infini
dist[source] = 0
répéter V - 1 fois:
modifie = faux
pour chaque arête (u, v, w):
si dist[u] + w < dist[v]:
dist[v] = dist[u] + w
parent[v] = u
modifie = vrai
si non modifie: sortir // sortie anticipée
// Une passe supplémentaire détecte les cycles négatifs
pour chaque arête (u, v, w):
si dist[u] + w < dist[v]:
signaler un cycle négatif atteignableL'invariant est qu'après la passe i, tout plus court chemin utilisant au plus i arêtes est correct. Comme un plus court chemin dans un graphe sans cycle négatif emprunte au plus V - 1 arêtes, V - 1 passes règlent tout. Si une V-ième passe améliore encore quelque chose, c'est qu'un chemin raccourcit sans limite, ce qui est exactement la définition d'un cycle négatif.
Exécute Bellman-Ford depuis A sur un graphe comportant une arête négative que Dijkstra traiterait mal. Les arêtes sont relâchées dans l'ordre fixe indiqué.
Graphe d'exemple: Arêtes orientées A vers B (4), A vers C (5), B vers C (-3) et C vers D (2).
Les distances correctes sont A 0, B 4, C 1, D 3. Une seule arête négative suffit à mettre Dijkstra en défaut, et c'est la raison d'être de Bellman-Ford.
Temps: O(VE) · Espace: O(V)
L'algorithme effectue V - 1 passes, chacune relâchant les E arêtes une fois, d'où O(VE). L'espace se limite à une distance et un parent par sommet, soit O(V), remarquablement indépendant de E. Sur un graphe dense où E approche V au carré, le temps tend vers O(V au cube), raison pour laquelle Bellman-Ford est réservé aux cas comportant réellement des poids négatifs. Le test de sortie anticipée, qui interrompt dès qu'une passe ne change rien, termine souvent en quelques passes sur des graphes réels même si le pire cas reste V - 1.
Bellman-Ford est strictement plus général que Dijkstra et strictement plus lent. Ne le choisis que si tu as vraiment besoin de ce qu'il apporte.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Algorithme de Dijkstra | Tous les poids sont positifs ou nuls. Nettement plus rapide et le choix par défaut correct. | O((V + E) log V) |
| BFS | Le graphe est non pondéré, le nombre de sauts est donc la distance. | O(V + E) |
| Floyd-Warshall | Tu veux les distances entre toutes les paires plutôt que depuis une source, et le graphe est petit ou dense. | O(V^3) |
| SPFA (Bellman-Ford à file) | Poids négatifs sur un graphe creux. Bien plus rapide en pratique, le pire cas restant O(VE). | O(VE) au pire |
| Algorithme de Johnson | Plus courts chemins entre toutes les paires avec poids négatifs sur un graphe creux. Un Bellman-Ford pour repondérer, puis Dijkstra depuis chaque sommet. | O(V·E + V^2·log V) |
Lire l'article complet: Shortest Path Algorithms Explained
Algorithmes associés: Algorithme de Dijkstra, Algorithme de Floyd-Warshall, Détection de Cycles