当前位置: 首页 > 知识库问答 >
问题:

为什么所有成对最短路径算法都使用负权重?

丌官星渊
2023-03-14

我最近一直在研究所有成对最短路径算法,比如Floyd Warshall和Johnson的算法,我注意到这些算法即使在图包含负权重边(但不是负权重圈)时也能产生正确的解。相比之下,Dijkstra的算法(单源最短路径)不适用于负权重边。是什么让全对最短路径算法在负权重下工作?

共有2个答案

韩峰
2023-03-14

Dijkstra的算法不适用于负权重边缘,因为它基于贪婪策略(一个假设),即一旦顶点v被添加到集合S中,d[v]包含可能的最小距离。

但是如果Q中的最后一个顶点被加到S上,并且它有一些输出的负权重边。负边对距离的影响不算数。

然而,所有对最短路径算法将捕获那些更新。

公孙霖
2023-03-14

Floyd Warshall的全对最短路径算法适用于边权重为负的图,因为该算法的正确性并不取决于边的权重是否为非负,而Dijkstra算法的正确性正是基于这一事实。

Dijkstra算法的正确性:

我们在算法的任何一步都有两组顶点。集合A由我们计算出最短路径的顶点组成。集合B由剩余的顶点组成。

归纳假设:在每一步,我们将假设所有以前的迭代都是正确的。

归纳步骤:当我们在集合A中添加顶点V并将距离设置为dist[V]时,我们必须证明该距离是最佳的。如果这不是最佳的,那么必须有一些其他的路径到达顶点V,其长度较短。

假设另一条路径穿过集合B中的某个顶点X。

现在,因为dist[V]

弗洛伊德·沃沙尔算法的正确性:从顶点S到顶点T的任何路径都将穿过图的任何其他顶点U。因此,从S到T的最短路径可以计算为

图中所有顶点U的最小(最短路径(S到U)最短路径(U到T))。

正如您所看到的,只要子调用正确计算路径,图的边缘就不会是非负的。只要基本情况已经正确初始化,子调用就会正确计算路径。

 类似资料:
  • 给定一个包含许多节点的无向加权图,如何计算所有对最短路径的子集? 子集是指图中的一些节点,而不是全部节点(图的顶点子集可以手动指定,也可以通过某种聚类算法指定。所选顶点的数量可能占总顶点的1%~5%)。 Dijkstra或Floyd Warshall可能会计算额外的节点,这对于我的应用程序来说可能不够有效。 是否有算法可以计算出特定节点之间的所有对最短路径并获得良好的性能?

  • 主要内容:最短路径算法在给定的图存储结构中,从某一顶点到另一个顶点所经过的多条边称为 路径。 图 1 图存储结构 例如在图 1 所示的图结构中,从顶点 A 到 B 的路径有多条,包括 A-B、A-C-B 和 A-D-B。当我们给图中的每条边赋予相应的权值后,就可以从众多路径中找出总权值最小的一条,这条路径就称为 最短路径。 图 2 无向带权图 以图 2 为例,从顶点 A 到 B 的路径有 3 条,它们各自的总权值是:

  • 然而,出现的问题是,当我将一个顶点设置为一个旅游站点并给它一个权重时,该顶点在第一次访问时似乎根本没有权重。然后,当第二次访问顶点时,权重显示出来。我不知道问题出在哪里,但我猜是因为我没有直接编辑原始变量。 打印输出行标记在下面的**之间。一个在calculateShortest()中,另一个在calculateMin()中。 显示问题的行打印输出(不包括main方法输出):

  • 这个问题是NetworkX特有的。我可以创建自己的函数来完成所有我需要的事情,但是这需要更长的时间,所以我想避免它。 情况: 我有一个未加权图,由NetworkX无向图表示。从这个图中,我寻找“最短循环”——也就是说,对于给定的节点k,我正在寻找最短的简单路径(只通过一个节点一次),它离开k,然后返回k。 为了实现这一点,我想使用任何NetworkX最短路径算法,并从节点k到节点k进行搜索。问题是

  • 我已经用Python实现了基本的线性最短路径算法。根据我遇到的各种网站,这只适用于有向无环图,包括this,this和this。然而,我看不出为什么会这样。 编辑:正如Beta所要求的,下面是拓扑排序:

  • 本文向大家介绍Javascript中的最短路径算法,包括了Javascript中的最短路径算法的使用技巧和注意事项,需要的朋友参考一下 在图论中,最短路径问题是在图中的两个顶点(或节点)之间找到路径的问题,以使其构成边的权重之和最小。在这里,我们需要修改添加边缘并添加有向方法,以允许向边缘添加权重。  让我们看看如何添加它- 示例 现在,当在图上添加一条边时,如果我们不指定权重,则会为该边分配默认