Tôi đang cố gắng hiểu tại sao thuật toán Dijkstra sẽ không hoạt động với trọng số âm. Đọc một ví dụ về Đường dẫn ngắn nhất , tôi đang cố gắng tìm ra tình huống sau:
2
A-------B
\ /
3 \ / -2
\ /
C
Từ trang web:
Giả sử các cạnh đều hướng từ trái sang phải, Nếu chúng ta bắt đầu với A, thuật toán Dijkstra sẽ chọn cạnh (A, x) nhỏ nhất d (A, A) + chiều dài (cạnh), cụ thể là (A, B). Sau đó, nó đặt d (A, B) = 2 và chọn một cạnh khác (y, C) nhỏ nhất d (A, y) + d (y, C); sự lựa chọn duy nhất là (A, C) và nó đặt d (A, C) = 3. Nhưng nó không bao giờ tìm thấy con đường ngắn nhất từ A đến B, qua C, với tổng độ dài là 1.
Tôi không hiểu tại sao khi sử dụng cách triển khai Dijkstra sau đây, d [B] sẽ không được cập nhật lên 1
(Khi thuật toán đạt đến đỉnh C, nó sẽ chạy thư giãn trên B, thấy rằng d [B] bằng 2
và do đó cập nhật giá trị của nó thành 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)
}
Cảm ơn,
Meir