Cod sursa(job #1621506)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 29 februarie 2016 19:32:17
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <cstdio>
using namespace std;

const int N_max = 102;

int pred[N_max][N_max]; // pred[i][j] == PENULTIMUL VARF PE UN DRUM DE COST MINIM DE LA i LA j

int d[N_max][N_max];

int N;

void citire()
{
    int i, j;

    scanf("%d", &N);

    for(i = 1; i <= N; i++)
        for(j = 1; j <= N; j++) scanf("%d", &d[i][j]);
}

void roy_floyd()
{
    int k, i, j;

    for(k = 1; k <= N; k++)
        for(i = 1; i <= N; i++)
            for(j = 1; j <= N; j++)
                if( (d[i][j] > d[i][k] + d[k][j] || !d[i][j]) && i != j && d[i][k] && d[k][j] )
                {
                    d[i][j] = d[i][k] + d[k][j];

                    pred[i][j] = pred[k][j];
                }
}

void afisare()
{
    int i, j;

    for(i = 1; i <= N; i++)
    {
        for(j = 1; j <= N; j++) printf("%d ", d[i][j]);

        printf("\n");
    }
}

void drum(int x, int y)
{
    if(x != y) drum(x, pred[x][y]);

    printf("%d ", y);
}

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

    citire();

    roy_floyd();

    afisare();

    //drum();

    return 0;
}