我试图理解为什么Dijkstra的算法不能在负权重下工作。阅读有关最短路径的示例,我试图找出以下情况:
2
A-------B
\ /
3 \ / -2
\ /
C
从网站:
假设所有边缘都是从左到右定向的,如果我们从A开始,Dijkstra的算法将选择使d(A,A)+ length(edge)最小的边缘(A,x),即(A,B)。然后设置d(A,B)= 2并选择另一个使d(A,y)+ d(y,C)最小的边(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)
}
谢谢,
梅尔