![b6aea810adb1f7c6d9fa32b7bb388fd6.png](https://img-blog.csdnimg.cn/img_convert/b6aea810adb1f7c6d9fa32b7bb388fd6.png)
上一篇 介绍了Dijkstra算法及其代码实现,本篇开始介绍Floyd算法及其代码实现。 1Floyd算法思想
![4fb70f6b07338442ab480a98f1cec0da.png](https://img-blog.csdnimg.cn/img_convert/4fb70f6b07338442ab480a98f1cec0da.png)
Floyd(弗洛伊德)提出了另外一种用于计算有向图中所有顶点间的最短路径,这种算法成为Floyd算法,它的形式较Dijkstra算法更为简单。
Floyd算法仍然使用邻接矩阵存储的图,同时定义了一个二维数组A,其中每一个分量A[i,j]是顶点i到顶点j的最短路径长度。另外还使用了另一个二维数组path来保存最短路径信息。
Floyd算法的基本思想如下:
(1)初始时,对图中任意两个顶点Vi和Vj,如果从Vi到Vj存在边,则从Vi到Vj存在一条长度为cost[i,j]的路径,但该路径不一定是最短路径。初始化时,A[i,j]=cost[i,j]。
(2)在图中任意两个顶点Vi和Vj之间加入顶点Vk,如果Vi经Vk到达Vj的路径存在并更短,则用A[i,k]+A[k,j]的值代替原来的A[i,j]值。
(3)重复步骤(2),直到将所有顶点作为中间点依次加入集合中,并通过迭代公式不断修正A[i,j]的值,最终获得任意顶点的最短路径长度。
代码实现
static void Floyd(int[,] cost, int v){ int n = cost.GetLength(1); // 获取顶点个数 int[,] A = new int[n, n]; // 存放最短路径长度 int[,] path = new int[n, n];// 存放最短路径信息 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 辅助数组A和path的初始化 A[i, j] = cost[i, j]; path[i, j] = -1; } } // Flyod算法核心代码部分 for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 如果存在中间顶点K的路径 if (i != j && A[i, k] != 0 && A[k, j] != 0) { // 如果加入中间顶点k后的路径更短 if (A[i, j] == 0 || A[i, j] > A[i, k] + A[k, j]) { // 使用新路径代替原路径 A[i, j] = A[i, k] + A[k, j]; path[i, j] = k; } } } } } // 打印最短路径及路径长度 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (A[i, j] == 0) { if (i != j) { Console.WriteLine("从{0}到{1}没有路径!", i, j); } } else { Console.Write("从{0}到{1}的路径为:", i, j); Console.Write(i + "→"); // 使用递归获取指定顶点的路径 GetPath(path, i, j); Console.Write(j + " "); Console.WriteLine("路径长度为:{0}", A[i, j]); } } Console.WriteLine(); }}static void GetPath(int[,] path, int i, int j){ int k = path[i, j]; if (k == -1) { return; } GetPath(path, i, k); Console.Write(k + "→"); GetPath(path, k, j);}
基本测试
这里仍然适用上一篇中的例子,带权图如下图所示:
static void FloydTest(){ int[,] cost = new int[5, 5]; // 初始化邻接矩阵 cost[0, 1] = 10; cost[0, 3] = 30; cost[0, 4] = 90; cost[1, 2] = 50; cost[2, 4] = 10; cost[3, 2] = 20; cost[3, 4] = 60; // 使用Flyod算法计算最短路径 Floyd(cost, 0);}
测试结果如下图所示:
![d400258c2ce6c00948782a37348111da.png](https://img-blog.csdnimg.cn/img_convert/d400258c2ce6c00948782a37348111da.png)
本篇介绍了Floyd算法的基本思想及代码实现,至此图的部分就到此为止。下一篇,我们将要开始学习查找相关的数据结构。
4参考资料 程杰,《大话数据结构》 陈广,《数据结构(C#语言描述)》 段恩泽,《数据结构(C#语言版)》 往期 精彩 回顾每天5分钟用C#学习数据结构(28)
![2369566d21c3d53bf93456174e7df997.png](https://img-blog.csdnimg.cn/img_convert/2369566d21c3d53bf93456174e7df997.png)
?点击