Cod sursa(job #2815232)

Utilizator Andreea__Zavoiu Andreea Andreea__ Data 9 decembrie 2021 12:32:48
Problema Floyd-Warshall/Roy-Floyd Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
// complexitatea O(n^3)
#include <iostream>
#include <fstream>
#define Nmax 101
#define valMax 1001
using namespace std;

ifstream fin("royfloyd.in");
ofstream fout("royfloyd.out");

int n, w[Nmax][Nmax]; //  w = matricea ponderilor
int d[Nmax][Nmax];    //  d = matricea drumurilor minime
int p[Nmax][Nmax];    //  p = matricea de predecesori (/tati)

int main()
{
    fin >> n;
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++){
            fin >> w[i][j]; // citesc ponderea pentru fiecare muchie (i,j)
            d[i][j] = w[i][j];  // initializez matricea drumurilor minime cu ponderile

            // initializez predecesorul lui j :
            if(w[i][j] == valMax) p[i][j] = 0; // cu 0 daca de la i la j nu exista arc
            else p[i][j] = i;   // cu i daca am arc de la i la j
        }       // adica initial pe fiecare linie am indicele liniei i
    }

    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            for(int k=1; k<=n; k++){ // with only one intermediate vertex
                if (d[i][j] > d[i][k] + d[k][j]) {
                    d[i][j] = d[i][k] + d[k][j]; // actualizez drumul minim
                    p[i][j] = p[k][j]; // si tatal/predecesorul lui j
                }
        }

    for (int i=1; i<=n; i++) {
        for (int j = 1; j <= n; j++) {
            fout << d[i][j] << " ";
        }
        fout << endl;
    }

    return 0;
}