Cod sursa(job #2207606)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 26 mai 2018 03:31:04
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

template <typename T>
struct Floyd{
    vector<vector<pair<int, T>>> &G;
    vector<vector<T>> M;
    size_t n;
    int const oo = 1000000000;

    Floyd(decltype(G) G) : G(G), n(G.size()) {};

    void build(){
        M.resize(n + 1);
        for(int i = 0; i <= n; i++) {
            M[i].resize(n + 1, oo);
            M[i][i] = 0;
        }
        for(int i = 0; i < G.size(); i++)
            for(auto it : G[i])
                M[i][it.first] = it.second;

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

vector<vector<pair<int, int>>> *G;
int n;

void Read()
{

    cin>>n;
    G = new vector<vector<pair<int, int>>>(n+1);
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++){
            int x;
            cin>>x;
            if(x)
                G->at(i).emplace_back(j, x);
    }
}

void Solve()
{
    Floyd<int> *F = new Floyd<int>(*G);
    F->build();
    for(int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            cout << F->M[i][j] << " ";
        cout << "\n";
    }
    delete F;
    delete G;
}

int main(){
    freopen("royfloyd.in", "r", stdin);
    freopen("royfloyd.out", "w", stdout);
    ios_base::sync_with_stdio(false);
    Read();
    Solve();
    return 0;
}