Cod sursa(job #3233237)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 20:26:02
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int INF = 10000; // Valoare mare pentru inițializarea distanțelor

int main() {
    ifstream infile("royfloyd.in");
    ofstream outfile("royfloyd.out");

    if (!infile || !outfile) {
        cerr << "Error opening file" << endl;
        return 1;
    }

    int N;
    infile >> N;

    vector<vector<int>> dist(N, vector<int>(N));

    // Citim matricea inițială a ponderilor
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            infile >> dist[i][j];
            if (dist[i][j] == 0 && i != j) {
                dist[i][j] = INF; // Inițializăm cu INF dacă nu există muchie și nu este diagonală principală
            }
        }
    }

    // Aplicăm algoritmul Roy-Floyd
    for (int k = 0; k < N; ++k) {
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                if (dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                }
            }
        }
    }

    // Înlocuim valorile INF cu 0 pentru a semnifica absența unei muchii
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if (dist[i][j] == INF) {
                dist[i][j] = 0;
            }
        }
    }

    // Scriem matricea distanțelor minime în fișierul de ieșire
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            outfile << dist[i][j] << " ";
        }
        outfile << endl;
    }

    infile.close();
    outfile.close();

    return 0;
}