Robert W.Floyd和Stephen Warshall在1962年发表了Floyd-Warshall算法
如图,有1234,四个点,每个点都有一定的距离,比如1和2有2的距离,现在我想知道任意两个点的最短距离。
我先用“邻接矩阵存储法”将这个图转化为矩阵
竖坐标是出发点,横坐标是目的地,∞表示无穷大,也就是到不了,例如2到不1。有了这个矩阵,就可以用一个两维数组来存储。
现在切入重点:Floyd-Warshall算法。
拿从4到3来看,4到3直达为12,要想缩短,只有“换乘”。
我发现4还可以直达1,1换乘到3,这时距离为11,比直达要短。那有什么比这个还短的?到1时再换乘!不要走直达。我发现1可以到2,2换乘到3,这时距离为10,又短了。
我发现每个点都可以作为“换乘点”,先初始化直达的距离,再把1作为“换乘点”,计算出新的最短距离,再把1和2作为“换乘点”。。。最后1234全作为“换乘点”。这就是Floyd-Warshall算法的基本思想,现在上代码:
#include <stdio.h> int main() { int a[10][10], n, m, i, j, k, t1, t2, t3; int inf = 99999999;//这里定义的正无穷 //读入nm,n为顶点数,m为边的条数 scanf("%d %d", &n, &m); //初始化矩阵 for (i = 1; i <= n; i++) for(j = 1; j <= n; j++) if(i == j)a[i][j] = 0; else a[i][j] = inf; //读入边 for(i = 1; i <= m; i++) { scanf("%d %d %d", &t1, &t2, &t3); a[t1][t2] = t3; } //Floyd-Warshall算法核心代码 for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) for(k = 1; k <= n; k++) if(a[j][i] < inf && a[i][k] < inf && a[j][k] > a[j][i] + a[i][k]) a[j][k] = a[j][i] + a[i][k]; //输出最终结果 for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { printf("%10d", a[i][j]); } printf("\n"); } return 0; }
输入:
4 8 1 2 2 1 3 6 1 4 4 2 3 3 3 1 7 3 4 1 4 1 5 4 3 12
得出结果:
0 2 5 4 9 0 3 4 6 8 0 1 5 7 10 0
Floyd-Warshall算法思路貌似很复杂,但它的核心代码只有五行,时间复杂度是O(N3),如果我只想知道某一个点到其它点的最短距离,用这套算法就感觉太耗时了。算法发表者Robert W.Floyd也是图灵奖的获得者(屌爆了)。
相关推荐
1.版本:matlab2022A,包含...将Floyd-Warshall算法应用于ISOMAP中,可以计算数据点之间的最短路径距离,进而用于降维。 5.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
Floyd-Warshall算法是解决任意两点间的最短路径的一种算法。通常可以在任何图中使用,包括有向图、带负权边的图。
Floyd-Warshall 算法【算法概述】假如我们要找任意有向图或无向图中两个点之间的最短距离,使用Dijstra算法或者Bellman Fold算法时间复
基于C++实现的每对结点之间的最短路径(Floyd-Warshall算法)
算法课程实验里的题目,简单的用Floyd-Warshall实现有向图最短路径查找
代码实现了Floyd-Warshall算法,它接受一个带权重的有向图作为输入,计算出任意两个节点之间的最短路径。 在示例代码中,使用graph二维数组表示图的邻接矩阵,Integer.MAX_VALUE表示两个节点之间不存在直接连接。...
Floyd-Warshall 算法计算给定邻接矩阵的所有对最短路径矩阵。 该算法是 O(n^3),在大多数实现中,您会看到 3 个嵌套的 for 循环。 这在 Matlab 中效率很低,所以在这个版本中,两个内部循环被向量化(因此,它运行得...
-- 输入权重(或初始距离)矩阵必须具有节点未连接的 ... -- 输出是短路径的距离矩阵 D 和前任矩阵 P 使得 P(i,j) 是从 i 到 j 的最短路径上 j 之前的节点,因此如果要构建路径,则必须读取 P向后。 希望能帮助到你!
floyd-warshall-cython Floyd-Warshall 算法的有效 Cython 实现,用于在加权有向图中查找所有顶点对之间的最短路径距离。 见接触随时提出任何问题: 阿米特·莫斯科维奇·艾格峰。
Y2VisualGraph 在加权图中寻找最短路径的 Floyd-Warshall 算法演示
php-floydwarshall Floyd-Warshall算法PHP实现 如维基百科所述:“在计算机科学中,FloydWarshall算法是一种用于在加权有向图中找到最短路径的图分析算法。该算法的一次执行将在所有顶点对之间找到最短路径。”
Floyd-Warshall算法---创建此项目是为了完成CPCS-324最终项目的第一阶段--- 编程语言:JAVA 该程序使用Floyd-Warshall算法在连接的加权图中查找所有对的最短路径即从任何一个顶点到所有其他顶点的最短路径使用的图形...
使用floyd warshall算法求图中任意两点间最短路径 graph shortest path
在单个Julia文件 中的图中 实现 Dijkstra 和 Warshall-Floyd 最短路径算法
Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法
Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样,它计算图中的最短路径。然而,Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面,...
Floyd-Warshall算法,又叫Floyd算法,用于求每对顶点之间最短路径
floyd warshall ,最短路径
Floyd-warshall算法的基本思想是:如果从vi到vj有边,则从vi到vj存在一条长度为cost[i][j]的路径。该路径不一定是最短路径,尚需要进行n次试探。首先考虑路径(vi,v0, vj)是否存在。如果存在,则比较其路径长度。取...
3. Floyd-Warshall算法:通过动态规划的方式计算每两个点之间的最短路径长度,适用于小规模图的情况。 4. A*算法:基于Dijkstra算法,但每次选择离目标点最近的点进行扩展,加速算法运行时间。 以上算法都可以在有...