Cod sursa(job #1362031)

Utilizator paulhelmerPaul Helmer paulhelmer Data 26 februarie 2015 09:30:42
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

using namespace std;
int n, a[101][101];

ifstream f("royfloyd.in");
ofstream g("royfloyd.out");

//Algoritul Roy-Floyd pentru determinarea celor mai scurte drumuri intre oricare doua noduri din graf
//se citeste matricea ponderilor

void citire()
{
    f >> n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++) f >> a[i][j];
}
void afisare()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++) g << a[i][j] << " ";
        g << "\n";
    }
}
void royFloyd()
{
    for(int k=1; k<=n; k++)
        for (int i=1; i<=n; i++)
            for (int j=1; j<=n; j++)
    /*incerc sa merg de la nodul i la nodul j prin nodul k
    daca de la i la k si de la k la j exista drum
    si drumul direct de la i la j costa mai mult decat suma drumurilor de la i la k si de la k la j
    sau nu existra drum de la i la j
    si i este diferit de j
    atunci costul drumului de la i la j va fi suma costurilor drumurilor de la i la k si de la k la i;
    */
                if (a[i][k] && a[k][j] && (a[i][j] > a[i][k] + a[k][j] || !a[i][j]) && i != j)
                    a[i][j] = a[i][k] + a[k][j];
}
int main()
{
    citire();
    royFloyd();
    afisare();
    return 0;
}