Cod sursa(job #875971)

Utilizator dan.lincanDan Lincan dan.lincan Data 11 februarie 2013 02:37:20
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <vector>

using namespace std;

int** allocEfficientMatrix(int m, int n)
{
    int **matrix = new int*[m]();
    int *v = new int[m*n]();
    for(int i = 0; i < m; ++i)
    {
        matrix[i] = &v[i*n];
    }
    return matrix;
}

void deleteEfficientMatrix(int **matrix, int m, int n)
{
    delete[] matrix[0];
    delete[] matrix;
}

void readMatrix(int **matrix, int m, int n)
{
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < n; ++j)
            scanf("%d", &matrix[i][j]);
}

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

void redirectInput(const char *in, const char *out)
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
}

void solve(int **m, int n)
{
    for(int k = 0; k < n; ++k)
    {
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < n; ++j)
            {
                int w = m[i][k] + m[k][j];
                if(i != j && m[i][k] && m[k][j] && (w < m[i][j] || !m[i][j]) )
                    m[i][j] = w;
            }
    }
    printMatrix(m, n, n);
}

int main()
{
    redirectInput("royfloyd.in", "royfloyd.out");
    int n;
    scanf("%d", &n);
    int** m = allocEfficientMatrix(n, n);
    readMatrix(m, n, n);

    solve(m, n);

    deleteEfficientMatrix(m, n, n);
    return 0;
}