2 1
1----------2---------4
| | |
|3 |3 |1
| 6 | |
3---------5 ---------
好的,这就是图表。我的源节点是1
,目标节点是5
我的问题是。
算法是否会提供相同的输出?
也就是说,两者都会返回1->2->4->5
吗? (除非在dijkstra中不允许负权重)
提前感谢您的帮助。
答案 0 :(得分:25)
Bellman-Ford算法是一种单源最短路径算法,它允许负边缘权重并且可以在图中检测负循环。
Dijkstra算法也是另一种单源最短路径算法。但是,所有边的权重必须是非负的。
就您的情况而言,就总成本而言,没有区别,因为图中的边缘具有非负权重。但是,通常使用Dijkstra算法,因为二进制堆的典型实现具有Theta((|E|+|V|)log|V|)
时间复杂度,而Bellman-Ford算法具有O(|V||E|)
复杂度。
如果有多个路径具有最低成本,则返回的实际路径取决于实现(即使对于相同的算法)。
答案 1 :(得分:4)
Dijkstra算法中的顶点包含网络的全部信息。没有这样的事情,每个顶点只关心自己和它的邻居。另一方面,Bellman-Ford算法的节点仅包含与之相关的信息。该信息允许该节点仅知道它可以连接哪些邻居节点以及该关系来自哪个节点。 Dijkstra的算法比Bellman-Ford算法快,但第二种算法对解决某些问题更有用,例如路径的负权重。
答案 2 :(得分:0)
Djikstra算法是一种贪婪的技术,对于实现Bellmanford算法,我们需要动态方法。
在djikstra算法中,我们对循环中的每个节点/顶点进行松弛,而在贝尔曼福德算法中,我们仅执行松弛| v-1 |。次。
当边缘权重为正时,Dijkstra算法适用于图,而对于负边图,则由于贝尔曼福德算法优于djikstra的优势,即使边缘的权重为负,它也可以实现,因此Dijkstra算法适用于图
贝尔曼福德可以找到图解是否存在(即给定的有向图是否具有负权重循环),因为djikstra算法无法做到这一点。
通过线性数组实现时,djikstra算法的时间复杂度为O(v ^ 2),当通过binay堆或斐波那契堆实现时,O(e.log v)为O(| v | | e |)。 )时间复杂度。