Cod sursa(job #3214463)

Utilizator bpetru05Mitoiu Bogdan Petru bpetru05 Data 14 martie 2024 09:52:42
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
/**
 * Se da un graf orientat cu N noduri, memorat prin matricea ponderilor.
 *
 * Sa se determine pentru orice pereche de noduri x si y lungimea minima a drumului de la nodul x la nodul y si sa se afiseze matricea drumurilor minime.
 * Prin lungimea unui drum intelegem suma costurilor arcelor care-l alcatuiesc.
 *
 * Date de intrare
 * Fisierul de intrare royfloyd.in contine pe prima linie N, numarul de noduri al grafului, iar urmatoarele N linii contin cate N valori reprezentand matricea ponderilor (al j-lea numar de pe linia i+1 reprezinta costul muchiei de la i la j din graf, sau 0, in cazul in care intre cele doua noduri nu exista muchie).
 *
 * In fisierul de iesire royfloyd.out se vor afisa N linii a cate N valori, reprezentand matricea drumurilor minime.
 * */

int main() {
    std::ifstream fin("royfloyd.in");
    std::ofstream fout("royfloyd.out");
    int N;
    fin>>N;
    constexpr int infinity = 1000000;
    std::vector<std::vector<int>> M(N);
    std::vector<std::vector<int>> dist(N);
    for (int i = 0; i < N; ++i) {
        M[i] = std::vector<int>(N);
        dist[i] = std::vector<int>(N);
        for (int j = 0; j < N; ++j) {
            fin>>M[i][j];
            dist[i][j] = M[i][j];
            if(dist[i][j]==0)
                dist[i][j] = infinity;//M[i][j]<=1000
        }
        dist[i][i]=0;
    }

    for (int k = 0; k < N; ++k) {
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                if( dist[i][j] > dist[i][k] + dist[k][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if(dist[i][j]<infinity)
                fout<<dist[i][j];
            else
                fout<<0;
            fout<<" ";
        }
        fout<<'\n';
    }

    fin.close();
    fout.close();
    return 0;
}