Cod sursa(job #521167)

Utilizator cprodescuProdescu Corneliu-Claudiu cprodescu Data 11 ianuarie 2011 16:14:38
Problema Floyd-Warshall/Roy-Floyd Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int n,
   **matrix,
   **result;

void load_data()
{
    int i, j;
    scanf("%d", &n);
    matrix = malloc(n*sizeof(int*));
    matrix[0] = malloc(n*n*sizeof(int));
    for (i = 1; i < n; ++i)
        matrix[i] = matrix[i-1] + n;
    for (i = 0; i < n; ++i)
        for (j = 0; j < n; ++j)
            scanf("%d", &matrix[i][j]);
}

void process_data()
{
    int i, j, k;
    result = malloc(n*sizeof(int*));
    result[0] = malloc(n*n*sizeof(int));
    for (i = 1; i < n; ++i)
        result[i] = result[i-1] + n;
    
    /* Floyd-Warshall
     * initializing result matrix with INT_MAX 
     */
    
    for (i = 0; i < n; ++i)
        for (j = 0; j < n; ++j)
            if (i == j)
                result[i][j] = 0;
            else
                result[i][j] = INT_MAX / 2;
     
     for (i = 0; i < n; ++i)
         for (j = 0; j < n; ++j)
             for (k = 0; k < n; ++k)
                 if (result[i][j] > result[i][k] + matrix[k][j])
                     result[i][j] = result[i][k] + matrix[k][j];
}

void print_data()
{
    int i, j;
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
            printf("%d ", result[i][j]);
        printf("\n");
    }
    free(result[0]);
    free(result);
    free(matrix[0]);
    free(matrix);
}

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

    load_data();
    process_data();
    print_data();
    return 0;
}