我正在尝试理解为什么Dijkstra算法不能处理带有负权重的情况。在最短路径的示例中,我试图弄清以下情况:
2
A-------B
\ /
3 \ / -2
\ /
C
从网站上看:
假设所有边都从左到右有向,如果我们从A开始,Dijkstra算法将选择使d(A,A)+length(edge)最小的边(A,x),即(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)
}
感谢您的来信,
Meir