Guest User

Untitled

a guest
Jan 19th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define K 4 /* 基幹駅の数 */
  4.  
  5. typedef struct {
  6. char sec;
  7. int kl;
  8. int tokl;
  9. int kh;
  10. int tokh;
  11. } STATION_INFO;
  12.  
  13. void calcDist(int n, int (*dist)[n]);
  14. void print(int n, int (*dist)[n]);
  15. int findMin(int d1, int d2, int d3, int d4);
  16. int findShortestPath(int i, int j, int n, int (*dist)[n], STATION_INFO *si);
  17.  
  18. /* Warshall-Floyd法 */
  19. void calcDist(int n, int (*dist)[n]) {
  20. int from, to, via;
  21. #ifdef DEBUG
  22. print(n, dist);
  23. #endif
  24. for (via = 0; via < n; via++) {
  25. for (from = 0; from < n; from++) {
  26. for (to = from + 1; to < n; to++) {
  27. if (dist[from][to] > dist[from][via] + dist[via][to]) {
  28. dist[from][to] = dist[from][via] + dist[via][to];
  29. dist[to][from] = dist[from][via] + dist[via][to];
  30. }
  31. }
  32. }
  33. }
  34. #ifdef DEBUG
  35. print(n, dist);
  36. #endif
  37. }
  38.  
  39. void print(int n, int (*dist)[n]) {
  40. int from, to;
  41. for (from = 0; from < n; from++) {
  42. for (to = 0; to < n; to++) {
  43. printf("%4d", dist[from][to]);
  44. }
  45. printf("\n");
  46. }
  47. printf("\n");
  48. }
  49.  
  50. int findMin(int d1, int d2, int d3, int d4) {
  51. int ret = d1;
  52. if (ret > d2) ret = d2;
  53. if (ret > d3) ret = d3;
  54. if (ret > d4) ret = d4;
  55. return ret;
  56. }
  57.  
  58. int findShortestPath(int i, int j, int n, int (*dist)[n], STATION_INFO *si) {
  59. int d0, d1, d2, d3, d4, res;
  60. d1 = si[i].tokl + dist[si[i].kl][si[j].kl] + si[j].tokl;
  61. d2 = si[i].tokl + dist[si[i].kl][si[j].kh] + si[j].tokh;
  62. d3 = si[i].tokh + dist[si[i].kh][si[j].kl] + si[j].tokl;
  63. d4 = si[i].tokh + dist[si[i].kh][si[j].kh] + si[j].tokh;
  64. res = findMin(d4, d3, d2, d1);
  65. if (si[i].sec == si[j].sec) {
  66. d0 = abs(si[i].tokl - si[j].tokl); /* 同区間での距離 */
  67. if (d0 < res) res = d0;
  68. }
  69. return res;
  70. }
  71.  
  72. int main(void) {
  73. /* 基幹駅の路線情報 */
  74. int dist[][K] = {{ 0, 20, 40, 999},
  75. { 20, 0, 15, 15},
  76. { 40, 15, 0, 999},
  77. {999, 15, 999, 0}};
  78. /* 駅情報表 */
  79. STATION_INFO si[10] = {{'0', 0, 0, 0, 0}, // 駅1
  80. {'1', 1, 0, 1, 0}, // 駅2
  81. {'2', 2, 0, 2, 0}, // 駅3
  82. {'3', 3, 0, 3, 0}, // 駅4
  83. {'B', 0, 15, 2, 30}, // 駅5
  84. {'B', 0, 25, 2, 20}, // 駅6
  85. {'C', 0, 5, 2, 35}, // 駅7
  86. {'C', 0, 10, 2, 30}, // 駅8
  87. {'C', 0, 30, 2, 10}, // 駅9
  88. {'E', 1, 5, 3, 10}}; // 駅10
  89. int start, stop;
  90. calcDist(K, dist);
  91. printf("区間を指定 => "); scanf("%d %d", &start, &stop);
  92. printf("最短距離 = %d\n", findShortestPath(start - 1, stop - 1, K, dist, si));
  93. return 0;
  94. }
Add Comment
Please, Sign In to add comment