Cod sursa(job #2207605)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 26 mai 2018 03:29:13
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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]);
    }
};

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

void Read()
{

    cin>>n;
    G = make_unique<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()
{
    unique_ptr<Floyd<int>> F = make_unique<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";
    }
}

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