Sto cercando di capire perché l'algoritmo di Dijkstra non funzionerà con pesi negativi. Leggendo un esempio su Percorsi più brevi , sto cercando di capire il seguente scenario:
2
A-------B
\ /
3 \ / -2
\ /
C
Dal sito web:
Supponendo che i bordi siano tutti diretti da sinistra a destra, se iniziamo con A, l'algoritmo di Dijkstra sceglierà il bordo (A, x) minimizzando d (A, A) + lunghezza (bordo), cioè (A, B). Quindi imposta d (A, B) = 2 e sceglie un altro arco (y, C) minimizzando d (A, y) + d (y, C); l'unica scelta è (A, C) e pone d (A, C) = 3. Ma non trova mai il percorso più breve da A a B, via C, con lunghezza totale 1.
Non riesco a capire perché utilizzando la seguente implementazione di Dijkstra, d [B] non verrà aggiornato a 1
(Quando l'algoritmo raggiunge il vertice C, eseguirà un rilassamento su B, vedrà che d [B] è uguale a 2
, e quindi aggiornerà il suo valore a 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)
}
Grazie,
Meir