Cod sursa(job #2605939)

Utilizator KPP17Popescu Paul KPP17 Data 26 aprilie 2020 13:30:27
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#define fisier "ULTRA"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");

const int
N = 100,
VAL = 1000,
INF = N * VAL;

int n, cost[N][N]; // __cost_min[100][100];
#include <set>
std::set<int> _parcurse;

int _cost_min(int a, int b)
{
    if (_parcurse.find(a) != _parcurse.end())
        return INF;
    _parcurse.emplace(a);

    if (a == b)
        return 0;

    int rt = INF;

    for (int j = 0; j < n; j++)
        if (cost[a][j])
            rt = std::min(rt, cost[a][j] + _cost_min(j, b));

    return rt;
}

inline int cost_min(int a, int b)
{
    int cost = _cost_min(a, b);
    _parcurse.clear();
    return cost == INF? 0: cost;
}

int main()
{
    in >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            in >> cost[i][j];

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            out << cost_min(i, j) << ' ';
        out << '\n';
    }
}