Я намагаюся зрозуміти, чому алгоритм Дейкстри не буде працювати з негативними вагами. Читаючи приклад на Найкоротші Шляхи , я намагаюся з'ясувати такий сценарій:
2
A-------B
\ /
3 \ / -2
\ /
C
З веб-сайту:
Якщо припустити, що ребра всі спрямовані зліва направо, якщо ми почнемо з A, алгоритм Дейкстри вибере край (A, x), мінімізуючи d (A, A) + довжину (край), а саме (A, B). Потім він встановлює d (A, B) = 2 і вибирає інший край (y, C), мінімізуючи d (A, y) + d (y, C); єдиний вибір - (A, C) і він встановлює d (A, C) = 3. Але він ніколи не знаходить найкоротшого шляху від А до В через С, загальною довжиною 1.
Я не можу зрозуміти, чому використання наступної реалізації Dijkstra, d [B] не буде оновлено до 1
(Коли алгоритм досягне вершини C, він запустить релакс на B, побачимо, що d [B] дорівнює 2
, і тому оновити його значення для 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)
}
Дякую,
Мейр