我试图理解为什么 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)
}
谢谢,
梅尔