歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用C語言實現Dijkstra算法及測試用例

用C語言實現Dijkstra算法及測試用例

日期:2017/3/1 10:08:15   编辑:Linux編程

源代碼發上。

一、最短路徑算法

例子:

二、源代碼

  1. /******************************
  2. * date:2011-3-31
  3. * filename:dijkstra_main.c
  4. * by:Jelline
  5. * ****************************/
  6. #include <stdio.h>
  7. #define MAX_WEIGHT 0X7FFFFFFF
  8. int dijkstra(int n, int adjMatrix[][n], int startV, int endV, int prev[]);
  9. void printShortestPath(int n, int adjMatrix[][n], int startV, int endV, const char **vertexStr);
  10. int main()
  11. {
  12. //char vertex[] = {'a', '1', '2', '3', '4', '5', '6', 'b'};
  13. const char *vertexStr[8] = {"a", "v1", "v2", "v3", "v4", "v5", "v6", "b"};
  14. int adjMatrix[8][8] = {
  15. {MAX_WEIGHT, 2, 8, 1, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT},
  16. {2, MAX_WEIGHT, 6, MAX_WEIGHT, 1, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT},
  17. {8, 6, MAX_WEIGHT, 7, 4, 2, 2, MAX_WEIGHT},
  18. {1, 7, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 9, MAX_WEIGHT},
  19. {MAX_WEIGHT, 1, 4, MAX_WEIGHT, MAX_WEIGHT, 3, MAX_WEIGHT, 9},
  20. {MAX_WEIGHT, 2, MAX_WEIGHT, MAX_WEIGHT, 3, MAX_WEIGHT, 4, 6},
  21. {MAX_WEIGHT, MAX_WEIGHT, 2, 9, MAX_WEIGHT, 4, MAX_WEIGHT, 2},
  22. {MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 9, 6, 2, MAX_WEIGHT}
  23. };
  24. /*
  25. int adjMatrix[8][8] = {
  26. //{0, 1, 2, 3, 4, 5, 6, 7}
  27. {0, 2, 8, 1, 0, 0, 0, 0},
  28. {2, 0, 6, 0, 1, 0, 0, 0},
  29. {8, 6, 0, 7, 4, 2, 2, 0},
  30. {1, 7, 0, 0, 0, 0, 9, 0},
  31. {0, 1, 4, 0, 0, 3, 0, 9},
  32. {0, 2, 0, 0, 3, 0, 4, 6},
  33. {0, 0, 2, 9, 0, 4, 0, 2},
  34. {0, 0, 0, 0, 9, 6, 2, 0}
  35. };
  36. */
  37. /*
  38. int prev[8];
  39. int shortestPath = dijkstra(8, adjMatrix, 0, 7, prev);
  40. printf("the sum of shortest weight is %d\n", shortestPath);
  41. */
  42. printShortestPath(8, adjMatrix, 0, 7, vertexStr);
  43. return 0;
  44. }
  45. /******************************************************
  46. *Fuction:
  47. * 求圖最短路徑長度,並存儲跡
  48. * Input:
  49. * n--頂點個數
  50. * adjMatrix[n][n]--圖的鄰接矩陣
  51. * startV--源點
  52. * endV--結束點
  53. * prev[i]記錄從源到頂點的最短路徑上i的前一個頂點
  54. *Out:
  55. * 輸出最短路徑長度
  56. * ******************************************************/
  57. int dijkstra(int n, int adjMatrix[][n], int startV, int endV, int prev[n])
  58. {
  59. int dist[n]; //dist[i]表示從源到頂點i的最短特殊路徑長度
  60. int mask[n]; //mask[i]標記頂點i是否加入集合 -1表示已加入集合
  61. int shortestPath = 0;
  62. int minWeight = MAX_WEIGHT;
  63. int minID;
  64. int i;
  65. int j;
  66. int tmp = 0;
  67. for (i=0; i<n; i++)
  68. {
  69. mask[i] = 0; //初始化集合為空集,即沒有元素加入
  70. dist[i] = adjMatrix[startV][i]; //初始化dist[j]
  71. prev[i] = -1;
  72. prev[i] = (adjMatrix[startV][i] != MAX_WEIGHT) ? startV : -1;
  73. }
  74. //prev[0] = startV;
  75. // dist[startV] = -1; //起點標記為-1 不被更新
  76. mask[startV] = -1; //標記源點已加入
  77. for (i=1; i<n; i++) //最多再加入n-1個頂點
  78. {
  79. minWeight = MAX_WEIGHT;
  80. //尋找下一個待加入的頂點
  81. for (j=0; j<n; j++)
  82. {
  83. if (mask[j]!=-1 && dist[j]<minWeight)
  84. {
  85. minWeight = dist[j];
  86. minID = j;
  87. }
  88. }
  89. mask[minID] = -1; //加入頂點
  90. if (minID == endV) //最後一個節點已加入
  91. {
  92. return dist[endV];
  93. }
  94. //更新dist[i]
  95. for (j=0; j<n; j++)
  96. {
  97. if (minWeight==MAX_WEIGHT || adjMatrix[minID][j]==MAX_WEIGHT)
  98. continue;
  99. tmp = minWeight + adjMatrix[minID][j];
  100. if(j!=startV && tmp<dist[j]) //起點無須更新
  101. {
  102. dist[j] = tmp;
  103. prev[j] = minID;
  104. }
  105. }
  106. }
  107. }
  108. //print path
  109. void printShortestPath(int n, int adjMatrix[][n], int startV, int endV, const char **vertexStr)
  110. {
  111. int prev[n];
  112. int shortestPath = dijkstra(n, adjMatrix, startV, endV, prev);
  113. printf("the shortest path is: %d= ", shortestPath);
  114. int tmp = endV;
  115. do
  116. {
  117. printf("%s <--- ", vertexStr[tmp]);
  118. tmp = prev[tmp];
  119. }while(tmp != startV);
  120. printf("%s\n", vertexStr[startV]);
  121. }

三、測試結果

the shortest path is: 11= b <--- v6 <--- v2 <--- v4 <--- v1 <--- a

Copyright © Linux教程網 All Rights Reserved