Cod sursa(job #352595)

Utilizator slayerdmeMihai Dumitrescu slayerdme Data 2 octombrie 2009 16:19:43
Problema Floyd-Warshall/Roy-Floyd Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 100
// INFINITE * 100 should be < MAXINT
// INFINITE should be > max value(1000) * 100
#define INFINITE 10000000
#define min( a, b) ( (a) > (b) ? (b) : (a))

int main() {
    freopen("royfloyd.in", "r", stdin);
    freopen("royfloyd.out", "w", stdout);

    int n;
    int edgeCost[MAXN][MAXN], shortestPath[MAXN][MAXN][MAXN];
    int i, j, k;

    scanf("%d", &n);
    for (i = 0; i < n; i ++) {
        for (j = 0; j < n; j ++) {
            scanf("%d", &edgeCost[i][j]);
            if (edgeCost[i][j] == 0) {
                edgeCost[i][j] = INFINITE;
            }
            shortestPath[i][j][0] = edgeCost[i][j];
        }
    }

    for (k = 1; k < n; k ++) {
        for (i = 0; i < n; i ++) {
            for (j = 0; j < n; j ++) {
                if (i != j) {
                   shortestPath[i][j][k] = min(shortestPath[i][j][k - 1], shortestPath[i][k][k - 1] + shortestPath[k][j][k - 1]);
                }
            }
        }
    }

    for (i = 0; i < n; i ++) {
        for (j = 0; j < n; j ++) {
            if (shortestPath[i][j][n - 1] < INFINITE) {
                printf("%d ", shortestPath[i][j][n - 1]);
            } else {
                printf("0 ");
            }
        }
        printf("\n");
    }

    fclose(stdout);
    return 0;
}