我正在使用此参考资料:http://www.cs.arizona.edu/classes/cs545/fall09/ShortestPath.prn.pdf
在第3页的最后一张幻灯片中,它说我们正在放松从B离开的边缘。但是在那一点上,B和E之间没有边缘,尽管在幻灯片中考虑了B!怎么可能?这是作者的错误还是错过了其他的东西?
修改
这是算法(来自该pdf):
这就是我所说的示例图:
目的是获得A和D之间的最短路径。 首先,起始顶点“A”用0权重初始化。然后其余的人被分配无限。你可以从算法的前3行看到它。然后,接下来创建一个空的集合“S”。我们有一个Q集合,它是一个队列,它将保存图形的所有顶点。我们首先从Q得到最小加权顶点。在第一次,我们将在这里得到起始顶点,因为我们在初始化中分配了0,其余的顶点都是无穷大。因此,较小的值为0,我们得到顶点A.我们将其添加到集合“S”。然后我们将遍历该顶点“A”的所有相邻顶点,我们将检查顶点的权重是否大于顶点“A”的权重。如果是,则通过添加顶点“A”的权重和“A”与该相邻顶点之间的边的权重来重新计算相邻顶点权重。这一直持续到设定的Q变空。
这是我理解的工作。
怀疑是在这一部分:
当我们放松从顶点“E”离开的边缘时,我们是如何得到顶点“B”的? B和E之间没有边缘!!!
我希望你现在能够了解我的问题。如果你看一下pdf而不是我的愚蠢解释,我想你会有更多的想法。不是吗? :P这就是为什么我在这个问题的开头也提到了链接!
答案 0 :(得分:0)
d[v]
表示:节点v
与起始点之间的最短路径长度,方法是遍历S
中的节点。
尽管节点E没有连接到B,但我们从之前的迭代中了解到,通过A
和{{1},从B
到A
存在长度为7的路径} 只要。我们当然可以通过仅C
,A
和C
来推断存在相同的路径。
请注意,在第一张幻灯片中代码的突出显示部分中,仅当存在较小的值时才会更新E
。如果没有,d[v]
保持不变。
我注意到OP对d[v]
感到困惑。我想补充一点,在这个算法中,S
只有在它可以帮助解释程序正在做什么的意义上才有用。 (当我向你解释S
的含义时,我使用了它。)d[v]
根本没有影响程序。如果从程序中完全删除S
,程序的工作方式也相同。
此程序不提供最短路径。它只告诉你起始节点和图中每个节点之间最短路径的长度。
如果您想获得最短路径,则需要修改程序以添加此功能。以下是步骤:
S
之前或之后,添加d[v] = d[u] + w(u,v)
。这样,您就保留了有关如何获得当前p[v] = u
的信息,即将最短路径移至d[v]
,然后使用u
。u->v
,然后你会发现{ {1}}。因此,路径为p[B]=C
。