Dijkstra算法和Floyd算法

以下两段选自:Dijkstra算法和Floyd算法对比分析

Dijkstra算法本质上是贪心算法,下一条路径都是由当前更短的路径派生出来的更长的路径。不存在回溯的过程。如果权值存在负数,那么被派生出来的可能是更短的路径,这就需要过程可以回溯,之前的路径需要被更短的路径替换掉,而Dijkstra算法是不能回溯的。它每一步都是以当前最优选择为前提的。所以,按照Dijkstra的算法逻辑,它是不能计算负权图的。

Floyd算法实际上是一个动态规划算法。 每一个点对u和v之间的最短路径,可能会经过N个点,这些中间点记为k。 假定u到k之间的最短路径已经找好,k到v之间的最短路径已经找好,那么求u到v之间的最短路径,就是遍历各个可能的k点,然后求(u,k)+(k,v)之间的最小值。 所以这实际上将大规模的问题自顶向下划分为了小规模的问题,这就是动态规划思想。因为动态规划是可以回溯的,它可以计算负权图。

---------分割线君-----------

Dijkstra算法和Floyd算法的区别之处:
总结来说就是
1.Dijkstra不能处理负权图,Flyod能处理负权图;
2.Dijkstra处理单源最短路径,而Flyod是处理多源最短路径
这个区别有个博主写的特别好,生动又形象,来吧!传送门:最短路径——Dijkstra算法和Floyd算法
3.Dijkstra时间复杂度为O(n^2)

Flyod时间复杂度为O(n^3) 空间复杂度为O(n ^ 2)

=>题目中如果是单源点正权图,就用Dijkstra,如果是任意两个点之间的最短路径或者是负权图,就用Floyd

 

posted @ 2020-03-04 16:46  SavenNeer  阅读(1801)  评论(0编辑  收藏  举报