了解Dijkstra的Algo

时间:2014-03-08 05:12:59

标签: algorithm dijkstra

我正在使用此参考资料:http://www.cs.arizona.edu/classes/cs545/fall09/ShortestPath.prn.pdf

在第3页的最后一张幻灯片中,它说我们正在放松从B离开的边缘。但是在那一点上,B和E之间没有边缘,尽管在幻灯片中考虑了B!怎么可能?这是作者的错误还是错过了其他的东西?

修改

这是算法(来自该pdf):

enter image description here

这就是我所说的示例图:

enter image description here

目的是获得A和D之间的最短路径。 首先,起始顶点“A”用0权重初始化。然后其余的人被分配无限。你可以从算法的前3行看到它。然后,接下来创建一个空的集合“S”。我们有一个Q集合,它是一个队列,它将保存图形的所有顶点。我们首先从Q得到最小加权顶点。在第一次,我们将在这里得到起始顶点,因为我们在初始化中分配了0,其余的顶点都是无穷大。因此,较小的值为0,我们得到顶点A.我们将其添加到集合“S”。然后我们将遍历该顶点“A”的所有相邻顶点,我们将检查顶点的权重是否大于顶点“A”的权重。如果是,则通过添加顶点“A”的权重和“A”与该相邻顶点之间的边的权重来重新计算相邻顶点权重。这一直持续到设定的Q变空。

这是我理解的工作。

怀疑是在这一部分:

enter image description here

当我们放松从顶点“E”离开的边缘时,我们是如何得到顶点“B”的? B和E之间没有边缘!!!

我希望你现在能够了解我的问题。如果你看一下pdf而不是我的愚蠢解释,我想你会有更多的想法。不是吗? :P这就是为什么我在这个问题的开头也提到了链接!

1 个答案:

答案 0 :(得分:0)

d[v]表示:节点v与起始点之间的最短路径长度,方法是遍历S中的节点。

尽管节点E没有连接到B,但我们从之前的迭代中了解到,通过A和{{1},从BA存在长度为7的路径} 只要。我们当然可以通过仅CAC来推断存在相同的路径。

请注意,在第一张幻灯片中代码的突出显示部分中,仅当存在较小的值时才会更新E。如果没有,d[v]保持不变。

我注意到OP对d[v]感到困惑。我想补充一点,在这个算法中,S只有在它可以帮助解释程序正在做什么的意义上才有用。 (当我向你解释S的含义时,我使用了它。)d[v]根本没有影响程序。如果从程序中完全删除S,程序的工作方式也相同。

此程序不提供最短路径。它只告诉你起始节点和图中每个节点之间最短路径的长度。

如果您想获得最短路径,则需要修改程序以添加此功能。以下是步骤:

  • 在程序的then子句中,S之前或之后,添加d[v] = d[u] + w(u,v)。这样,您就保留了有关如何获得当前p[v] = u的信息,即将最短路径移至d[v],然后使用u
  • 整个程序结束后(即在while循环之后),说你想知道从A到B的最短路径是什么。你会发现u->v,然后你会发现{ {1}}。因此,路径为p[B]=C