Saya mencoba memahami mengapa algoritma Dijkstra tidak akan bekerja dengan bobot negatif. Membaca contoh di Jalur Terpendek , saya mencoba mencari tahu skenario berikut:
2
A-------B
\ /
3 \ / -2
\ /
C
Dari situs web:
Dengan asumsi edge semua terarah dari kiri ke kanan, Jika kita mulai dengan A, algoritma Dijkstra akan memilih edge (A, x) meminimalkan d (A, A) + length (edge), yaitu (A, B). Ini kemudian menetapkan d (A, B) = 2 dan memilih sisi lain (y, C) meminimalkan d (A, y) + d (y, C); satu-satunya pilihan adalah (A, C) dan menetapkan d (A, C) = 3. Tetapi ia tidak pernah menemukan jalur terpendek dari A ke B, melalui C, dengan total panjang 1.
Saya tidak dapat memahami mengapa menggunakan implementasi Dijkstra berikut, d [B] tidak akan diperbarui ke 1
(Ketika algoritme mencapai simpul C, itu akan berjalan santai di B, lihat bahwa d [B] sama dengan 2
, dan karenanya perbarui nilainya menjadi 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)
}
Terima kasih,
Meir