Cod sursa(job #2483866)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 30 octombrie 2019 14:21:38
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#define INF 1<<20
using namespace std;

vector<vector<int>> init_dist_mat(int n) {
    vector<vector<int>> mat;
    for (int i = 0; i < n; ++i) {
        vector<int> aux;
        for (int j = 0; j < n; ++j)
            aux.push_back(INF);
        mat.push_back(aux);
    }

    return mat;
}

vector<vector<int>> read_mat(ifstream &f, int n) {
    int x;
    vector<vector<int>> d;

    for (int i = 0; i < n; ++i) {
        vector<int> aux_d;
        for (int j = 0; j < n; ++j) {
            f >> x;
            aux_d.push_back(x == 0 ? INF : x);
        }
        d.push_back(aux_d);
    }

    return d;
}

void write_mat(ofstream &g, vector<vector<int>> mat) {
    for (int i = 0; i < mat.size(); ++i) {
        for (int j = 0; j < mat[i].size(); ++j)
            g << (i == j || mat[i][j] == INF ? 0 : mat[i][j]) << " ";
        g << "\n";
    }
}

void floyd_warshall(vector<vector<int>> &d) {
    // Initialize distance matrix
    int n = d.size();

    for (int k = 0; k < n; ++k)
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main() {
    ifstream f("royfloyd.in");
    ofstream g("royfloyd.out");

    int n;
    vector<vector<int>> d;

    // Read input data
    f >> n;
    d = read_mat(f, n);

    // Perform Floyd-Warshall algo
    floyd_warshall(d);

    // Write result
    write_mat(g, d);

    return 0;
}