Cod sursa(job #3292772)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 9 aprilie 2025 12:03:27
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

using namespace std;

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

const int Nmax = 105;
const int INF = 1e9;

int n;
int cost[Nmax][Nmax], drum_minim[Nmax][Nmax];

void citire_matrice_ponderi(){
    fin >> n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            fin >> cost[i][j];
        }
    }
}

void initializare(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            drum_minim[i][j] = cost[i][j];

            if(drum_minim[i][j] == 0 && i != j){
                drum_minim[i][j] = INF;
            }
        }
    }
}

void roy_floyd(){
    initializare();

    bool existaModificari = 1;
    while(existaModificari){
        existaModificari = 0;

        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                if(i != j){
                    for(int aux = 1; aux <= n; aux++){
                        if(aux != i && aux != j && drum_minim[i][j] > drum_minim[i][aux] + drum_minim[aux][j]){
                            drum_minim[i][j] = drum_minim[i][aux] + drum_minim[aux][j];
                            existaModificari = 1;
                        }
                    }
                }
            }
        }
    }
}

void afisare_solutie(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(drum_minim[i][j] == INF){
                drum_minim[i][j] = 0;
            }

            fout << drum_minim[i][j] << ' ';
        }
        fout << '\n';
    }
}

int main(){
    citire_matrice_ponderi();
    roy_floyd();
    afisare_solutie();

    return 0;
}