当前位置:   article > 正文

弗洛伊德(Floyd)算法求个顶点之间最短路径问题(详解+图解)_2.用floyd算法求每一对顶点之间的最短路径,写出完整实现代码、截图运行结果

2.用floyd算法求每一对顶点之间的最短路径,写出完整实现代码、截图运行结果

弗洛伊德算法,是一种用于寻找图形中所有最短路径的算法。它的基本思想是通过一定的规则逐步更新每个节点的最短路径估计值,直到每个节点的最短路径估计值收敛为止。

具体来说,弗洛伊德算法通过求解所有点对之间的最短路径来实现。在算法开始时,我们假设图中的所有节点之间都是不联通的,即它们之间的距离为无穷大。然后,我们对图进行“松弛”操作,即尝试更新每个节点之间的距离估计值,以寻找更短的路径。具体来说,对于图中的每个节点对(i,j),我们检查是否存在一个节点k,使得从i到k再到j的路径比已知的最短路径更短。如果是的话,我们就更新(i,j)之间的距离估计值为更短的路径长度。

通过重复这个过程,我们最终得到了图中所有节点之间的最短路径估计值。弗洛伊德算法的时间复杂度为O(n^3),其中n是图中节点的数量。

1548472489cc408f9fd042f3af776f61.png

邻接矩阵为

e88c3483f1c547f993f630249b1f8d58.png

弗洛伊德算法

每次都选一个顶点作为中转点

第一次将V0作为中转点

对所有顶点i,j做判断dist[i][j]>dist[i][k]+dist[k][j] (k为此时的中转点

8646e4470eec4fa19c7b4842bc097e8b.png

第二次将V1作为中转点

再次对所有顶点i,j做判断dist[i][j]>dist[i][k]+dist[k][j] (k为此时的中转点

4aad36c10c8e480888279c7d9b546034.png

第三次将V2作为中转点

对所有顶点i,j做判断dist[i][j]>dist[i][k]+dist[k][j] (k为此时的中转点

e7ff9c6cb7ca41a28b27e59907f1a766.png

就得到了最终结果

下面我们来看一下代码是如何实现的(c语言代码实现)

  1. void floyd(int graph[n][n])//弗洛伊德求各顶点之间的最短路径
  2. {
  3. int dist[n][n];
  4. for (int i = 0; i < n; i++)//初始化距离矩阵
  5. {
  6. for (int j = 0; j < n; j++)
  7. dist[i][j] = graph[i][j];
  8. }
  9. for (int k = 0; k < n; k++)//逐一考虑每个顶点作为中间顶点
  10. {
  11. for (int i = 0; i < n; i++)//
  12. {
  13. for (int j = 0; j < n; j++)
  14. {
  15. if (dist[i][j] > dist[i][k] + dist[k][j])//k作为中间顶点,可以缩短(i,j)的距离
  16. dist[i][j] = dist[i][k] + dist[k][j];
  17. }
  18. }
  19. }
  20. for (int i = 0; i < n; i++)
  21. {
  22. for (int j = 0; j < n; j++)
  23. {
  24. if (dist[i][j] != Max)
  25. printf("%d\t", dist[i][j]);
  26. else
  27. printf("Max");
  28. }
  29. printf("\n");
  30. }
  31. }

完整测试代码

  1. #include<stdio.h>
  2. #define Max 0xFFFF
  3. #define n 3
  4. void floyd(int graph[n][n])//弗洛伊德求各顶点之间的最短路径
  5. {
  6. int dist[n][n];
  7. for (int i = 0; i < n; i++)//初始化距离矩阵
  8. {
  9. for (int j = 0; j < n; j++)
  10. dist[i][j] = graph[i][j];
  11. }
  12. for (int k = 0; k < n; k++)//逐一考虑每个顶点作为中间顶点
  13. {
  14. for (int i = 0; i < n; i++)//
  15. {
  16. for (int j = 0; j < n; j++)
  17. {
  18. if (dist[i][j] > dist[i][k] + dist[k][j])//k作为中间顶点,可以缩短(i,j)的距离
  19. dist[i][j] = dist[i][k] + dist[k][j];
  20. }
  21. }
  22. }
  23. for (int i = 0; i < n; i++)
  24. {
  25. for (int j = 0; j < n; j++)
  26. {
  27. if (dist[i][j] != Max)
  28. printf("%d\t", dist[i][j]);
  29. else
  30. printf("Max");
  31. }
  32. printf("\n");
  33. }
  34. }
  35. int main()
  36. {
  37. int graph[n][n] = { {0,6,13},{10,0,4} ,{5,Max,0} };
  38. floyd(graph);
  39. return 0;
  40. }

7ad9186e10c0424698b8dd6c5c21368c.png

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/797424
推荐阅读
相关标签
  

闽ICP备14008679号