Cod sursa(job #1069980)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 30 decembrie 2013 19:44:53
Problema Floyd-Warshall/Roy-Floyd Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
# include <cstdio>
# include <queue>

using namespace std;

const int N = 100;

int a [N + 1] [N + 1];
queue <int> q;
int n;

void citeste ()
{
    int i, j;

    scanf ("%d", & n);

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

void init ()
{
    freopen ("royfloyd.in", "r", stdin);
    freopen ("royfloyd.out", "w", stdout);
    citeste ();
}

void royFloyd ()
{
    int i, j, aux;

    for (i = 1; i <= n; i ++)
    {
        q. push (i);

        while (q. size ())
        {
            aux = q. front ();

            for (j = 1; j <= n; j ++)
                if (j != i && a [aux] [j])
                    if (a [i] [j] == 0 || a [aux] [j] + a [i] [aux] <= a [i] [j])
                    {
                        q. push (j);
                        a [i] [j] = a [aux] [j] + a [i] [aux];
                    }

            q. pop ();
        }
    }

}

void afisare ()
{
    int i, j;

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

        printf ("\n");
    }
}

int main ()
{
    init ();

    royFloyd ();

    afisare ();

    return 0;
}