Dijkstra algoritmasının neden negatif ağırlıklarla çalışmayacağını anlamaya çalışıyorum. En Kısa Yollar hakkında bir örnek okurken , aşağıdaki senaryoyu anlamaya çalışıyorum:
2
A-------B
\ /
3 \ / -2
\ /
C
Web sitesinden:
Kenarların hepsinin soldan sağa yönlendirildiğini varsayarsak, A ile başlarsak, Dijkstra'nın algoritması d (A, A) + uzunluğu (kenar) en aza indiren (A, B) kenarı (A, x) seçecektir. Daha sonra d (A, B) = 2'yi ayarlar ve d (A, y) + d (y, C) 'yi en aza indiren başka bir kenar (y, C) seçer; tek seçenek (A, C) 'dir ve d (A, C) = 3'ü ayarlar. Ama hiçbir zaman toplam uzunluğu 1 olan C yoluyla A'dan B'ye en kısa yolu bulamaz.
Aşağıdaki Dijkstra, d [B] uygulamasını kullanmanın neden güncellenmeyeceğini anlayamıyorum 1
(Algoritma C köşesine ulaştığında, B üzerinde bir gevşeme çalıştıracak, d [B] 'nin eşit olduğuna bakın 2
ve bu nedenle güncellenir değeri 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)
}
Teşekkürler,
Meir