fork download
  1. /*
  2. 実行後の入力形式は
  3. ------------------------------
  4. 頂点数 辺数
  5. 始点 終点 コスト
  6. 始点 終点 コスト
  7. ...(辺の本数分だけ入力)
  8. (最短距離を求めたい)始点 終点
  9. ------------------------------
  10. です.
  11.  
  12. $ gcc -o cycle cycle.c
  13. $ cycle.exe
  14. 7 10
  15. 0 1 30
  16. 0 3 10
  17. 0 2 15
  18. 1 3 25
  19. 1 4 60
  20. 2 3 40
  21. 2 5 20
  22. 3 6 35
  23. 4 6 20
  24. 5 6 30
  25. 0 6
  26. distance:45
  27. 6 -> 3 -> 0
  28.  
  29. */
  30.  
  31. #include <stdio.h>
  32.  
  33. #define INF 10000000
  34. #define SIZE 1000
  35. #define TRUE 1
  36. #define FALSE 0
  37.  
  38. int DIST[SIZE][SIZE];
  39. int COST[SIZE];
  40. int VIA[SIZE];
  41. int N;
  42. char USED[SIZE];
  43.  
  44. int dijkstra(int start, int goal)
  45. {
  46. int min, target;
  47.  
  48. COST[start] = 0;
  49.  
  50. while (1)
  51. {
  52.  
  53. /* 未確定の中から距離が最も小さい地点(a)を選んで、その距離を その地点の最小距離として確定します */
  54. min = INF;
  55. for (int i = 0; i < N; i++)
  56. {
  57. if (!USED[i] && min > COST[i])
  58. {
  59. min = COST[i];
  60. target = i;
  61. }
  62. }
  63.  
  64. /* 全ての地点の最短経路が確定 */
  65. if (target == goal)
  66. return COST[goal];
  67.  
  68. /* 今確定した場所から「直接つながっている」かつ「未確定の」地点に関して、
  69.   今確定した場所を経由した場合の距離を計算し、今までの距離よりも小さければ書き直します。 */
  70. for (int neighboring = 0; neighboring < N; neighboring++)
  71. {
  72. if (COST[neighboring] > DIST[target][neighboring] + COST[target])
  73. {
  74. COST[neighboring] = DIST[target][neighboring] + COST[target];
  75. VIA[neighboring] = target;
  76. }
  77. }
  78. USED[target] = TRUE;
  79. }
  80. }
  81.  
  82. int main(void)
  83. {
  84. int r;
  85. int a, b, l;
  86. int s, d;
  87.  
  88. /* 初期化 */
  89. for (int i = 0; i < SIZE; i++)
  90. {
  91. COST[i] = INF;
  92. USED[i] = FALSE;
  93. VIA[i] = -1;
  94. for (int j = 0; j < SIZE; j++)
  95. DIST[i][j] = INF;
  96. }
  97.  
  98. /* 入力 */
  99. scanf("%d %d", &N, &r);
  100. for (int i = 0; i < r; i++)
  101. {
  102. scanf("%d %d %d", &a, &b, &l);
  103. DIST[a][b] = l;
  104. }
  105. scanf("%d %d", &s, &d);
  106.  
  107. /* ダイクストラ法で最短経路を求める */
  108. printf("distance:%d\n", dijkstra(s, d));
  109.  
  110. /* 経路を表示(ゴールから) */
  111. int node = d;
  112. printf("%d", node);
  113. while (1)
  114. {
  115. node = VIA[node];
  116. printf(" -> %d", node);
  117. if (node == s)
  118. break;
  119. }
  120.  
  121. return 0;
  122. }
Runtime error #stdin #stdout 0s 5276KB
stdin
Standard input is empty
stdout
Standard output is empty