答案 0 :(得分:4)
如果您要在不对图表进行任何更改的情况下运行Dijkstra的算法,那么您有可能不获得源和目标之间的最短路径。
例如,考虑S和O.现在,找到最短路径实际上取决于要将O推送到队列时正在遍历的边缘。如果你的代码选择权重为1的边缘,你就没事了。但是如果你的代码选择权重为8的边缘,那么你的算法会给你错误的答案。
这意味着算法的正确性现在取决于在源节点的邻接列表中输入的边的顺序。
答案 1 :(得分:2)
您可以简单地将图形转换为没有单边循环和平行边的图形。
对于单边循环,您需要检查其重量是负还是非负。如果重量为负,则显然没有最短路径,因为您可以保持旋转到位并减少超出任何限制的路径长度。然而,如果重量为正,则可以抛弃该边缘,因为没有最短路径可以通过该边缘。
零权重边缘会产生类似于任何零权重循环的问题:不会有一个而是无限数量的最短路径,一遍又一遍地经过同一个循环。在这些情况下,明智的做法是再次从图中删除边缘。
在平行边缘之外,您可以扔掉除了重量最轻的边缘以外的所有边缘。这样做的原因同样简单:如果有一条最短的路径通过边缘A
,其边缘B
具有较低的权重,则可以通过简单地替换{{1}来构建更短的路径与A
一起使用。因此,没有最短路径可以通过B
。
答案 2 :(得分:1)
它只需要一个小的变化。如果有多条边从 u 指向 v 并且每条边具有不同的权重,您可以:
虽然#2中的常数因子具有更高的值,但上述两者都具有相同的复杂性。
在任何情况下,您都需要确保在移动到 u 的下一个相邻节点之前评估 u 和 v 之间的所有边缘EM>
答案 3 :(得分:1)
我认为这不会造成任何问题。由于dijkstra算法将使用优先级队列,因此,场外最小值将首先得到更新。