Cod sursa(job #521183)

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

int n,
   **matrix;

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;
    
    /* Floyd-Warshall
     * initializing result matrix with INT_MAX 
     */
    
     for (k = 0; k < n; ++k)
         for (i = 0; i < n; ++i)
             for (j = 0; j < n; ++j)
                 if (matrix[k][j] && matrix[i][k] && ((matrix[i][j] > matrix[i][k] + matrix[k][j])|| !matrix[i][j]) && i!=j)
                     matrix[i][j] = matrix[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 ", matrix[i][j]);
        printf("\n");
    }
    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;
}