狄克斯特拉(Dijkstra)算法

作者:追风剑情 发布于:2014-8-2 20:15 分类:Algorithms

Dijkstra是求解某点到其他各点的最短路径算法。

开发工具 Visual Studio2010

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. const int MAXVEX = 6;//最大顶点数
  5. const int INF = 429496729;//无路径时的权值
  6.  
  7. /**
  8. * 狄克斯特拉算法
  9. * @param cost 图的代价矩阵
  10. * @param n 图的顶点数
  11. * @param v 源点(起点)编号
  12. */
  13. void Dijkstra(int cost[][MAXVEX], int n, int v)
  14. {
  15. int dist[MAXVEX], path[MAXVEX];
  16. int s[MAXVEX];
  17. int mindis, i, j, u, pre;
  18. for(i=0; i<n; i++)
  19. {
  20. dist[i] = cost[v][i]; //初始化距离
  21. s[i] = 0; //置空s[]
  22.  
  23. //初始化路径
  24. if(cost[v][i] < INF)
  25. path[i] = v;
  26. else
  27. path[i] = -1;
  28. }
  29.  
  30. s[v] = 1; //源点编号v放入s中
  31. path[v] = 0;
  32. //循环直到所有顶点的最短路径都求出
  33. for(i=0; i<n; i++)
  34. {
  35. mindis = INF;
  36. u = -1;
  37. for(j=0; j<n; j++) //选取不在s中且具有最小距离的顶点u
  38. {
  39. if(s[j] == 0 && dist[j] < mindis)
  40. {
  41. u = j;
  42. mindis = dist[j];
  43. }
  44. }
  45.  
  46. if (u != -1) //找到最小距离的顶点u
  47. {
  48. s[u] = 1; //顶点u加入s中
  49. for (j=0; j<n; j++) //修改不在s中的顶点距离
  50. {
  51. if (s[j] == 0)
  52. {
  53. if (cost[u][j] < INF && dist[u] + cost[u][j] < dist[j])
  54. {
  55. dist[j] = dist[u] + cost[u][j];//修改源点到vj的距离
  56. path[j] = u;//保存当前最短路径中的前一个顶点编号
  57. }
  58. }
  59. }
  60. }
  61. }
  62.  
  63. printf("\n Dijkstra算法求解如下:
  64. ");
  65. //输出最短路径长度,路径逆序输出
  66. for (i=0; i<n; i++)
  67. {
  68. printf("%d->%d:", v, i);
  69. if (i != v)
  70. {
  71. if (s[i] == 1)
  72. {
  73. printf("路径长度为%2d ", dist[i]);
  74. pre = i;
  75. printf("路径逆序为");
  76. while (pre != v) //直到求解到初始顶点
  77. {
  78. printf("%d, ", pre);
  79. pre = path[pre];
  80. }
  81. printf("%d\n", pre);
  82. }else{
  83. printf("不存在路径
  84. ");
  85. }
  86. }else{
  87. printf("不存在路径
  88. ");
  89. }
  90. }
  91.  
  92. printf("\n");
  93. }
  94.  
  95. void main()
  96. {
  97. //定义一个代价矩阵作为测试数据 INF:无路径
  98. int cost[6][MAXVEX] = {
  99. {0, 50, 10, INF, INF, INF},
  100. {INF, 0, 15, 50, 10, INF},
  101. {20, INF, 0, 15, INF, INF},
  102. {INF, 20, INF, 0, 35, INF},
  103. {INF, INF, INF, 30, 0, INF},
  104. {INF, INF, INF, 3, INF, 0 }
  105. };
  106.  
  107. Dijkstra(cost, 6, 1);
  108.  
  109. system("pause");
  110. }

运行效果

dijkstra.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号