Cod sursa(job #3261056)

Utilizator Oana_StanOana Stan Oana_Stan Data 4 decembrie 2024 11:08:52
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
using namespace std;

const int Inf = 1000000000; // Reprezintă infinitul pentru distanțe mari
const int MAX_N = 100;      // Dimensiunea maximă a grafului

int c[MAX_N][MAX_N];        // Matricea ponderilor

int main() {
    ifstream cin("royfloyd.in");
    ofstream cout("royfloyd.out");

    int n;
    cin >> n;

    // Citim matricea ponderilor
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> c[i][j];
            if (i != j && c[i][j] == 0) {
                c[i][j] = Inf; // Dacă nu există muchie, marcăm cu Inf
            }
        }
    }

    // Aplicăm algoritmul Roy-Floyd-Warshall
    for (int k = 0; k < n; ++k) {
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (c[i][k] < Inf && c[k][j] < Inf) { // Evităm depășiri numerice
                    if (c[i][j] > c[i][k] + c[k][j]) {
                        c[i][j] = c[i][k] + c[k][j];
                    }
                }
            }
        }
    }

    // Rezolvăm cazurile fără drum
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (c[i][j] == Inf) {
                c[i][j] = 0; // Dacă nu există drum, afișăm 0
            }
        }
    }

    // Afișăm matricea drumurilor minime
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << c[i][j] << " ";
        }
        cout << '\n';
    }

    return 0;
}