Dijkstra(G,w,s) {
ISS(G,s);
let S be an empty set
let Q be a priority queue, initialized with V[G]
while Q is not Empty:
u<-extractMin(Q);
add u to S
for each vertex v neighbor of u
Relax(u,v,w);
}
我的问题是,在算法的 while 循环中为什么要选择 Q 中所有 v 的最小 d [v],如果我们不选择最小值会发生什么?我觉得所有边缘 (u,v) 都会按照广度优先顺序进行放松(这意味着如果 s->u->v 且 (s,v) 不在 E,则 (s,u) 将在 (u,v) 之前被放松),那为什么每次都选择最小的 d[v] 是很重要的呢?
假设存在一个函数 extractMaxFiniteD(Q),它返回在 Q 中具有有限的最大 d[v] 值的顶点 v。
假设我们将这行代码更改为 u<-extractMaxFiniteD(Q); 能否有人为我画出一张图,在修改后的算法中它会失败 - 或者更好的是 - 最短路径的哪个属性会受到侵犯?
我知道这个问题可能相当困难和抽象,但如果有人能帮我解答就太好了。