Estou tentando entender por que o algoritmo de Dijkstra não funciona com pesos negativos. Lendo um exemplo sobre Shortest Paths , estou tentando descobrir o seguinte cenário:
2
A-------B
\ /
3 \ / -2
\ /
C
A partir do site:
Assumindo que as arestas estão todas direcionadas da esquerda para a direita, se começarmos com A, o algoritmo de Dijkstra escolherá a aresta (A, x) minimizando d (A, A) + comprimento (aresta), a saber (A, B). Em seguida, define d (A, B) = 2 e escolhe outra aresta (y, C) minimizando d (A, y) + d (y, C); a única escolha é (A, C) e define d (A, C) = 3. Mas ele nunca encontra o caminho mais curto de A para B, via C, com comprimento total 1.
Não consigo entender por que usar a seguinte implementação de Dijkstra, d [B] não será atualizado para 1
(Quando o algoritmo atinge o vértice C, ele executa um relaxamento em B, veja que ad [B] é igual a 2
e, portanto, atualiza seu 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)
}
Obrigado,
Meir