Cod sursa(job #1096671)

Utilizator dropsdrop source drops Data 2 februarie 2014 15:00:45
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
/* Algoritmul Roy-Floyd pentru determinarea drumului intre oricare doua noduri dintr-un graf orientat */
#include <cstdio>
#define MAX 101
#define INF 0x3f3f3f3f

int Bst[MAX][MAX], N;

void RoyFloyd()
{
    for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
    {
        if (Bst[i][j] == 0)
        {
            Bst[i][j] = INF;
        }
    }
    for (int k = 0; k < N; k++)
    for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
    if (i != j && i != k && j != k && Bst[i][j] > Bst[i][k] + Bst[k][j])
    {
        Bst[i][j] = Bst[i][k] + Bst[k][j];
    }
}

int main()
{
    freopen("royfloyd.in","r",stdin);
    freopen("royfloyd.out","w",stdout);
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
    {
        scanf("%d", &Bst[i][j]);
    }
    RoyFloyd();
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            printf("%d ", Bst[i][j] == INF ? 0 : Bst[i][j]);
        printf("\n");
    }
}