【浙江大学】数据结构,浙大的数据结构讲的很精炼,不枯燥易懂,十分适合数据结构的学习。
以下笔记也是根据以该课程为主,并加以具体实现代码。
Dijkstra算法可以求解单个点到其他点的最短路径,若要求任意两点之间的最短距离,使用Dijkstra算法则显得有些麻烦。为了解决这个问题,我们可以使用Floyd算法。
Floyd算法:Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。其时间复杂度为$O(N^3)$(因为代码里面有三个for循环),空间复杂度为$O(N^2)$。
Floyd算法采用了动态规划的思想,当求任意两点i,j的最短路径时有两种可能:
通过将上述两种情况相比较,从而确定i,j两点之间的最短路径。假设图G一共有N个顶点,分别用这N个顶点作为中介点进行路径更新,更新N此后即可求得任意两点之间的最短路径。
在编写代码的时候,我们需要两个N*N的数组dist和path,分别表示i,j两点之间的最短距离,以及i,j两点最短距离所经过的顶点。
关于三个for循环顺序为k,i,j的解释。
* 即,统计图中各个顶点间的最短路径。