ฉันพยายามทำความเข้าใจว่าทำไมอัลกอริทึมของ Dijkstra จึงไม่ทำงานกับน้ำหนักเชิงลบ อ่านตัวอย่างเกี่ยวกับเส้นทางที่สั้นที่สุดฉันกำลังพยายามหาสถานการณ์ต่อไปนี้:
2
A-------B
\ /
3 \ / -2
\ /
C
จากเว็บไซต์:
สมมติว่าขอบทั้งหมดชี้จากซ้ายไปขวาหากเราเริ่มต้นด้วย A อัลกอริทึมของ Dijkstra จะเลือกขอบ (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 แต่ไม่เคยพบเส้นทางที่สั้นที่สุดจาก A ถึง B ผ่าน C โดยมีความยาวทั้งหมด 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)
}
ขอบคุณ
เมียร์