Algorithm 具有平行边和自环的Dijkstra

Algorithm 具有平行边和自环的Dijkstra,algorithm,dijkstra,shortest-path,Algorithm,Dijkstra,Shortest Path,如果我有一个没有负权重的加权无向图,但可以在顶点和自循环之间包含多条边,我可以毫无问题地运行Dijkstra算法来找到源和目标之间的最小路径,或者存在一个反例? 我的猜测是没有问题,但我想确定一下 您可以轻松地将图形转换为没有单边循环和平行边的图形 对于单边循环,您需要检查其权重是否为负。如果权重为负,显然没有最短路径,因为您可以保持原地旋转,并将路径长度减少到任何限制之外。但是,如果权重为正,则可以将该边丢弃,因为没有最短路径可以通过该边 零权重边将产生与任何零权重循环类似的问题:将不会有一

如果我有一个没有负权重的加权无向图,但可以在顶点和自循环之间包含多条边,我可以毫无问题地运行Dijkstra算法来找到源和目标之间的最小路径,或者存在一个反例?


我的猜测是没有问题,但我想确定一下

您可以轻松地将图形转换为没有单边循环和平行边的图形

对于单边循环,您需要检查其权重是否为负。如果权重为负,显然没有最短路径,因为您可以保持原地旋转,并将路径长度减少到任何限制之外。但是,如果权重为正,则可以将该边丢弃,因为没有最短路径可以通过该边

零权重边将产生与任何零权重循环类似的问题:将不会有一条而是无限多条最短路径,一遍又一遍地通过同一个循环。在这些情况下,明智的做法是再次从图形中删除边


在平行边之外,除了重量最小的边外,你可以扔掉所有的边。对此的推理同样简单:如果有一条最短路径通过一条具有较低权重的平行边
B
的边
a
,则只需将
a
替换为
B
,就可以构建一条更短的路径。因此,没有最短路径可以通过
A

如果您要运行Dijkstra的算法而不对图形进行任何更改,则有可能无法获得源和目标之间的最短路径

例如,考虑S和O。现在,找到最短路径实际上取决于当你想把O推到队列中时,正在遍历哪个边。如果你的代码选择了权重为1的edge,你就没事了。但是,如果您的代码选择权重为8的边,那么您的算法将给出错误的答案


这意味着算法的正确性现在取决于在源节点的邻接列表中输入的边的顺序

它只需要一个小的变化。如果有多条从u到v的边,且每条边的权重不同,则可以:

  • 选择边缘最小的砝码进行松弛;或
  • 为每一个边缘跑步放松
  • 尽管#2中的常数因子具有更高的值,但上述两种情况的复杂性相同


    在任何情况下,您都需要确保在移动到u的下一个相邻节点之前计算u和v之间的所有边。

    我认为这不会产生任何问题。因为dijkstra算法将使用优先级队列,所以当然最小值将首先得到更新。

    好的,听起来不错。但我的问题是:如果我在该图上运行Dijkstra算法而不做任何修改,可能会有问题?@Manuel,这完全取决于实现。例如,在计算从节点
    N
    到其所有邻居的距离的步骤中,实现可能会假设从
    N
    到另一个节点的每个传出边,因此它可能会将结果存储在节点为关键点的映射中。在这种情况下,平行边很容易导致错误的结果。重要的是,它是否有效不是算法的属性,而是实现的属性。就像前面提到的答案一样,它实际上取决于dijkstra算法的特定实现。实现可以很好地工作,因为它将所有可能的并行边中最小的边添加到您正在使用的数据结构中,以跟踪尚未探索的节点。