Estoy tratando de entender por qué el algoritmo de Dijkstra no funcionará con pesos negativos. Al leer un ejemplo en Shortest Paths , estoy tratando de descubrir el siguiente escenario:
2
A-------B
\ /
3 \ / -2
\ /
C
Desde el sitio web:
Suponiendo que todos los bordes están dirigidos de izquierda a derecha, si comenzamos con A, el algoritmo de Dijkstra elegirá el borde (A, x) minimizando d (A, A) + longitud (borde), es decir (A, B). Luego establece d (A, B) = 2 y elige otro borde (y, C) minimizando d (A, y) + d (y, C); la única opción es (A, C) y establece d (A, C) = 3. Pero nunca encuentra el camino más corto de A a B, a través de C, con una longitud total de 1.
No puedo entender por qué al usar la siguiente implementación de Dijkstra, d [B] no se actualizará a 1
(Cuando el algoritmo alcance el vértice C, ejecutará una relajación en B, verá que d [B] es igual a 2
, y por lo tanto actualizará su valor para 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)
}
Gracias,
Meir