[数据结构]-图-floyd算法原理
Dijkstra算法
1.定义概览
1)对于无权的图来说:
若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。
由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。
2)对于带权的图来说:
考虑路径上各边上的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或称带权路径长度。
从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或者最短距离。
3)Floyd算法(Floyd-Warshall algorithm)
,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法在应对稠密图时有着较强的优势。适用范围
:无负权回路即可,边权可正可负,运行一次算法即可求得任意两点间最短路。
优缺点
:
Floyd算法适用于APSP(AllPairsShortestPaths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单
缺点:时间复杂度比较高,不适合计算大量数据。
时间复杂度:O(n^3);空间复杂度:O(n^2);
2.算法描述
任意节点i到j的最短路径两种可能:
- 直接从i到j;
- 从i经过若干个节点k到j。
map(i,j)表示节点i到j最短路径的距离,对于每一个节点k,检查map(i,k)+map(k,j)小于map(i,j)
,如果成立,map(i,j) = map(i,k)+map(k,j)
;遍历每个k,每次更新的是除第k行和第k列的数(就是自己本身)。
图片描述
顶点名称和下标的对应
A B C D E F G
0 1 2 3 4 5 6
第2步:
以A为中间点,原D矩阵中,D[B][G]的值为INF,即不存在B->G的最小路径,但是通过A为中间点,D[B][A] + D[A][G] = 12 + 14 = 26 小于 D[B][G] = INF, 所以D[B][A] + D[A][G] 为 B -> G的最小值,因此覆盖D[B][G] 为 26。
第3步:
以B为中间点,第2步后的D矩阵中,D[A][C]的值为INF, 但是通过B,D[A][B] + D[B][C] = 12 + 10 = 22 小于 D[A][C] = INF,所以D[A][B] + D[B][C] 为 A->C的最小路径,覆盖D[A][C]的值为22, 以此类推。
第4步….
3.核心算法描述
4.代码实现
周末昨晚作业再补
5.补充
主要参考
1.最短路径模板+解析——(FLoyd算法)
2.弗洛伊德(Floyd)算法求图的最短路径