J'essaie de comprendre pourquoi l'algorithme de Dijkstra ne fonctionnera pas avec des poids négatifs. En lisant un exemple sur les chemins les plus courts , j'essaie de comprendre le scénario suivant:
2
A-------B
\ /
3 \ / -2
\ /
C
Depuis le site Web:
En supposant que les arêtes sont toutes dirigées de gauche à droite, si nous commençons par A, l'algorithme de Dijkstra choisira l'arête (A, x) minimisant d (A, A) + longueur (arête), à savoir (A, B). Il pose alors d (A, B) = 2 et choisit une autre arête (y, C) minimisant d (A, y) + d (y, C); le seul choix est (A, C) et il fixe d (A, C) = 3. Mais il ne trouve jamais le chemin le plus court de A à B, via C, avec une longueur totale de 1.
Je ne peux pas comprendre pourquoi en utilisant l'implémentation suivante de Dijkstra, d [B] ne sera pas mis à jour en 1
(Lorsque l'algorithme atteint le sommet C, il exécutera un relâchement sur B, voir que le d [B] est égal à 2
, et donc mettre à jour sa valeur à 1
).
Dijkstra(G, w, s) {
Initialize-Single-Source(G, s)
S ← Ø
Q ← V[G]//priority queue by d[v]
while Q ≠ Ø do
u ← Extract-Min(Q)
S ← S U {u}
for each vertex v in Adj[u] do
Relax(u, v)
}
Initialize-Single-Source(G, s) {
for each vertex v V(G)
d[v] ← ∞
π[v] ← NIL
d[s] ← 0
}
Relax(u, v) {
//update only if we found a strictly shortest path
if d[v] > d[u] + w(u,v)
d[v] ← d[u] + w(u,v)
π[v] ← u
Update(Q, v)
}
Merci,
Meir