Cod sursa(job #2223625)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 20 iulie 2018 21:01:37
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

const string IN_FILE = "royfloyd.in";
const string OUT_FILE = "royfloyd.out";
const int INF = 0x3f3f3f3f;

vector<vector<int>> royFloyd(const vector<vector<int>>& costs) {
    const int n = int(costs.size());
    auto distances = vector<vector<int>>(costs);
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                distances[i][j] =
                        min(distances[i][j], distances[i][k] + distances[k][j]);
            }
        }
    }
    return distances;
}

vector<vector<int>> readInput() {
    ifstream in(IN_FILE);
    int n;
    in >> n;
    auto costs = vector<vector<int>>(n, vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            in >> costs[i][j];
            costs[i][j] = costs[i][j] == 0 ? INF : costs[i][j];
        }
        costs[i][i] = 0;
    }
    in.close();
    return costs;
}

void writeOutput(const vector<vector<int>>& distances) {
    ofstream out(OUT_FILE);
    const int n = int(distances.size());
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            out << (distances[i][j] == INF ? 0 : distances[i][j]);
            out << (j + 1 < n ? " " : "\n");
        }
    }
    out.close();
}

int main() {
    const auto costs = readInput();
    const auto distances = royFloyd(costs);
    writeOutput(distances);
    return 0;
}