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