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

Dijkstra vs Bellman-ford一个有向图,这将给出不同的结果

马弘益
2023-03-14

我试图学习图,在图中我发现,要找到从一个节点到另一个节点的最短路径,我们可以使用Dijkstra和Bellman-ford算法。

其中Dijkstra将不适用于包含负权重边的图形。而Brllman-ford可以处理这种包含负权重边的图形。

我的疑问是,我尝试了许多种包含负权重边缘的图形,并应用了Dijkstra和Bellman-ford两者,但在所有情况下,我发现了相同的结果,我的意思是没有区别,对于负权重边缘也dijkstra工作正常。可能是我的思维过程或我如何解决的方式是错误的,所以只有我得到正确的答案为dikstra。

我的问题是谁能给我解释一个有负边的图,并解释dijkstra和bellman ford的不同结果。

共有1个答案

公孙慎之
2023-03-14

求两条边之间最短路径的Djikstra算法只能用于具有正权重的图。要了解bellman ford和djikstra在边缘权重为负时给出的答案的差异,让我们举一个简单的例子

we have 3 nodes in the graph, A B C
A is connected to B edge weight 4
A is connected to C edge weight 2
B is connected to C edge weight -3

当djikstra用于计算A和C之间的最短路径时,我们得到权重2

但当使用贝尔曼·福特计算A和C之间的最短路径时,权重为1

发生这种情况是因为djikstra最终确定了具有最小边权重的节点,忽略了可能存在到该节点的权重较低的路径这一事实(请注意,只有当存在负权重时才会发生这种情况。只有正权重时,这是不可能的)。

希望你能理解其中的区别

 类似资料:
  • 我有一些困难理解福特-富尔克森算法的最大流量,希望得到一些帮助。 您会注意到节点B和C有一个双向边沿,B-C的容量为8,C-B的容量为3。 现在假设下一条路径是a-c-b-d-f。 我的问题是,我们现在能够通过C-B推动多少流量?是11通过使用8已经推动的流量加上能力3在另一个边缘还是只有3或可能8? 谢谢你抽出时间。

  • 问题内容: 当我运行此代码时: 我在Eclipse的JUnit运行程序中得到以下结果: 这导致从命令行Maven: 如您所见,时间有所不同。 (同一台计算机,相同的Java版本,可能相隔30秒)。为什么? [编辑] 时区也不同。从Maven 启动和从Eclipse 启动时,为什么要使用Java ? 或换一种说法:如何强制Java使用两者? 问题答案: 要指定默认时区,您可以设置系统属性。您可以通过

  • 我在Cplex中使用Python API来解决一个线性编程问题。使用Cplex时,我的结果如下: 但随后我将LP prolem保存为LP文件,并再次使用Cplex进行求解,结果与第一个略有不同: 下面是我的功能:

  • 问题内容: 我有一个导入一些servlet库的类。当我从命令行编译它时就可以了。 当我使用ant编译任务对其进行编译时,它会给出错误,即在其路径中找不到servlet库。 那是已知/常见的事件吗? 这是我的Ant目标: 问题答案: 如果您没有在任务的类路径中正确指定servlet库,这是一种常见的情况…我怀疑这就是问题所在。如果您发布失败的任务和有效的命令行,我们将为您提供更多帮助。

  • 当我在本文中使用<code>dplyr::case_when<code>而不是<code>if<code>时,我注意到了下面的这种行为。如果第二个分支的输出是一个显式字符串,它将按预期工作,但如果指定了<code>x</code>本身,结果将发生变化。 为什么只有< code>case_when给出不同的结果? 由reprex软件包(v2.0.1)于2022年8月16日创建

  • 问题内容: 我有两个成员相同,我想将一个结构复制到另一个结构,请参见下面的伪代码: 然后,我有结构的,而结构的,有什么办法复制的? 问题答案: 使用转换更改类型。以下代码使用转换将type 的值复制到type 的值: 游乐场的例子 该转换仅在基础类型,除了结构标签相同的工作。