Cod sursa(job #2844814)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 5 februarie 2022 16:08:40
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;

template <typename T>
struct FloydWarshall
{
    // all costs are != 0
    // matrix[i][j] = 0 -> no path from i to j, any i, j
    FloydWarshall()
    {
    }

    void run_alg(int matrix_size, vector<vector<T>> &matrix)
    {
        int i, j, k;
        for (k = 1; k <= matrix_size; k++)
            for (i = 1; i <= matrix_size; i++)
                for (j = 1; j <= matrix_size; j++)
                    if (matrix[i][k] && matrix[k][j] && (matrix[i][j] > matrix[i][k] + matrix[k][j] || !matrix[i][j]) && i != j)
                        matrix[i][j] = matrix[i][k] + matrix[k][j];
    }
    void printResult(int matrix_size, vector<vector<T>> &matrix)
    {
        int i, j;
        for (i = 1; i <= matrix_size; i++)
        {
            for (j = 1; j <= matrix_size; j++)
                cout << matrix[i][j] << " ";
            cout << "\n";
        }
    }
};
void solve()
{
    int n;
    int i, j;
    freopen("royfloyd.in", "r", stdin);
    freopen("royfloyd.out", "w", stdout);
    cin >> n;
    vector<vector<int>> a(n + 1);
    for (i = 1; i <= n; i++)
    {
        a[i].push_back(0);
        for (j = 1; j <= n; j++)
        {
            int x;
            cin >> x;
            a[i].push_back(x);
        }
    }
    FloydWarshall<int> fw;
    fw.run_alg(n, a);
    fw.printResult(n, a);
}
int32_t main()
{
    solve();
    return 0;
}