弗洛伊德(Floyed)算法

作者:追风剑情 发布于:2014-10-6 17:12 分类:Algorithms

求每对顶点之间的最短路径

开发工具 Visual Studio2010

开发语言 C++

GG.png

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. const int MAXVEX = 6;//最大顶点数
  5. const int INF = 429496729;//无路径时的权值
  6.  
  7. /**
  8. * 求每对顶点之间的最短路径
  9. * 弗洛伊德(Floyed)算法
  10. */
  11. void Floyed(int cost[][MAXVEX], int n)
  12. {
  13. int A[MAXVEX][MAXVEX], path[MAXVEX][MAXVEX];
  14. int i,j,k,pre;
  15. for(i=0; i<n; i++)
  16. for(j=0; j<n; j++)
  17. {
  18. A[i][j] = cost[i][j];
  19. path[i][j] = -1;
  20. }
  21.  
  22. for(k=0; k<n; k++)
  23. {
  24. for(i=0; i<n; i++)
  25. {
  26. for(j=0; j<n; j++)
  27. {
  28. if(A[i][j] > A[i][k] + A[k][j])
  29. {
  30. A[i][j] = A[i][k] + A[k][j];
  31. path[i][j] = k;
  32. }
  33. }
  34. }
  35. }
  36.  
  37. printf("\n Floyed 算法求解如下:
  38. ");
  39. for(i=0; i<n; i++) //输出最短路径
  40. {
  41. for(j=0; j<n; j++)
  42. {
  43. if(i != j){
  44. printf("%d->%d:", i, j);
  45. if(A[i][j] == INF){
  46. printf("不存在路径
  47. ");
  48. }else{
  49. printf("路径长度为:%3d ", A[i][j]);
  50. printf("路径为%d ", i);
  51. pre = path[i][j];
  52. while(pre != -1){
  53. printf("%d ", pre);
  54. pre = path[pre][j];
  55. }
  56. printf("%d\n", j);
  57. }
  58. }
  59. }
  60. }
  61. }
  62.  
  63. void main()
  64. {
  65. //定义一个代价矩阵作为测试数据 INF:无路径
  66. int cost[6][MAXVEX] = {
  67. {0, 50, 10, INF, INF, INF},
  68. {INF, 0, 15, 50, 10, INF},
  69. {20, INF, 0, 15, INF, INF},
  70. {INF, 20, INF, 0, 35, INF},
  71. {INF, INF, INF, 30, 0, INF},
  72. {INF, INF, INF, 3, INF, 0 }
  73. };
  74. Floyed(cost, 6);
  75.  
  76. printf("\n");
  77. system("pause");
  78. }

Floyed.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号