2

我了解到 Bellman-Ford 算法的运行时间为 O(|E|*|V|),其中 E 是边数,V 是顶点数。假设该图没有任何负加权循环。

我的第一个问题是,我们如何证明在 (|V|-1) 次迭代中(每次迭代检查 E 中的每条边),在给定特定起始节点的情况下,它会更新到每个可能节点的最短路径?有没有可能我们已经迭代了 (|V|-1) 次,但仍然没有得到到每个节点的最短路径?

假设算法的正确性,我们实际上可以做得更好吗?在我看来,并非所有边在特定图中都具有负权重。Bellman-Ford 算法似乎很昂贵,因为每次迭代都要经过每个边缘。

4

1 回答 1

2

从源到任何顶点的最长可能路径最多将涉及图中的所有其他顶点。换句话说 - 你不会有一条路径不止一次地通过同一个顶点,因为这必然会增加权重(这只是因为没有负循环这一事实才成立)。
在每次迭代中,您将更新该路径中下一个顶点的最短路径权重,直到在 |V|-1 次迭代之后,您的更新必须到达该路径的末尾。之后将不会有任何具有非紧密值的顶点,因为您的更新已经覆盖了该长度的所有最短路径。

这种复杂性是紧密的(至少对于 BF),想想一长串连接的顶点。选择最左边的作为源 - 您的更新过程必须一次从那里到另一边一个顶点。现在您可能会争辩说您不必以这种方式检查每条边,所以让我们加入一些具有非常大权重(N > |V|*max-weight)的随机边——它们帮不了你,但是您的算法无法确定这一点,因此如果必须通过这些权重更新顶点的过程(它们仍然比初始无穷大更好)。

于 2013-11-16T22:48:51.527 回答