fork download
  1. #include <stdio.h>
  2.  
  3. #define INF 99999
  4. #define N 6
  5.  
  6. int graph[N][N] = {
  7. {0, 2, INF, 8, INF, INF},
  8. {2, 0, INF, 5, 6, INF},
  9. {INF, INF, 0, INF, 9, 3},
  10. {8, 5, INF, 0, INF, 2},
  11. {INF, 6, 9, INF, 0, 1},
  12. {INF, INF, 3, 2, 1, 0}
  13. };
  14.  
  15. void floydWarshall(int dist[N][N], int pred[N][N]) {
  16. for (int i = 0; i < N; i++) {
  17. for (int j = 0; j < N; j++) {
  18. dist[i][j] = graph[i][j];
  19. if (graph[i][j] != INF && i != j)
  20. pred[i][j] = i;
  21. else
  22. pred[i][j] = -1;
  23. }
  24. }
  25.  
  26. for (int k = 0; k < N; k++) {
  27. for (int i = 0; i < N; i++) {
  28. for (int j = 0; j < N; j++) {
  29. if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
  30. dist[i][j] = dist[i][k] + dist[k][j];
  31. pred[i][j] = pred[k][j]; // แก้ไขตรงนี้เพื่อให้ Predecessor Matrix อัปเดตถูกต้อง
  32. }
  33. }
  34. }
  35. }
  36. }
  37.  
  38. void printPath(int pred[N][N], int start, int end) {
  39. if (pred[start][end] == -1) {
  40. printf("ไม่มีเส้นทางจาก %c ไป %c\n", start + 'A', end + 'A');
  41. return;
  42. }
  43.  
  44. int path[N], count = 0;
  45. int current = end;
  46.  
  47. while (current != start) {
  48. path[count++] = current;
  49. current = pred[start][current];
  50. }
  51. path[count++] = start;
  52.  
  53. printf("เส้นทางที่สั้นที่สุดจาก %c ไป %c: ", start + 'A', end + 'A');
  54. for (int i = count - 1; i >= 0; i--) {
  55. printf("%c", path[i] + 'A');
  56. if (i > 0) printf(" → ");
  57. }
  58. printf("\n");
  59. }
  60.  
  61. int main() {
  62. int dist[N][N], pred[N][N];
  63.  
  64. floydWarshall(dist, pred);
  65.  
  66. printf("ระยะทางที่สั้นที่สุดจาก A ไป C: %d\n", dist[0][2]);
  67. printPath(pred, 0, 2);
  68.  
  69. return 0;
  70. }
Success #stdin #stdout 0.04s 25644KB
stdin
Standard input is empty
stdout
#include <stdio.h>

#define INF 99999
#define N 6

int graph[N][N] = {
    {0, 2, INF, 8, INF, INF},
    {2, 0, INF, 5, 6, INF},
    {INF, INF, 0, INF, 9, 3},
    {8, 5, INF, 0, INF, 2},
    {INF, 6, 9, INF, 0, 1},
    {INF, INF, 3, 2, 1, 0}
};

void floydWarshall(int dist[N][N], int pred[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            dist[i][j] = graph[i][j];
            if (graph[i][j] != INF && i != j)
                pred[i][j] = i;
            else
                pred[i][j] = -1;
        }
    }

    for (int k = 0; k < N; k++) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    pred[i][j] = pred[k][j];  // แก้ไขตรงนี้เพื่อให้ Predecessor Matrix อัปเดตถูกต้อง
                }
            }
        }
    }
}

void printPath(int pred[N][N], int start, int end) {
    if (pred[start][end] == -1) {
        printf("ไม่มีเส้นทางจาก %c ไป %c\n", start + 'A', end + 'A');
        return;
    }

    int path[N], count = 0;
    int current = end;

    while (current != start) {
        path[count++] = current;
        current = pred[start][current];
    }
    path[count++] = start;

    printf("เส้นทางที่สั้นที่สุดจาก %c ไป %c: ", start + 'A', end + 'A');
    for (int i = count - 1; i >= 0; i--) {
        printf("%c", path[i] + 'A');
        if (i > 0) printf(" → ");
    }
    printf("\n");
}

int main() {
    int dist[N][N], pred[N][N];

    floydWarshall(dist, pred);

    printf("ระยะทางที่สั้นที่สุดจาก A ไป C: %d\n", dist[0][2]);
    printPath(pred, 0, 2);

    return 0;
}