Cod sursa(job #2814878)

Utilizator truscalucaLuca Trusca truscaluca Data 8 decembrie 2021 18:57:12
Problema Floyd-Warshall/Roy-Floyd Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.63 kb
#include <iostream>
#include <list>
#include <queue>
#include <vector>
#include <stack>
#include <fstream>
#include <map>
#include <set>
#include <algorithm>
#include <climits>
#include <cstring>

#define INF INT_MAX

const int nMax = 100005;

using namespace std;

class Graf {
private:
    int m_n, m_m;
    int m_ponderatMatrice[105][105] = {};
    // RoyFloyd - https://www.infoarena.ro/problema/royfloyd
    int m_royFloydDists[105][105] = {};

public:
    // ---------------- Interfata publica ----------------
    explicit Graf(int n = 0, int m = 0) : m_n(n), m_m(m) {}


    /*************** Algoritmi generali ***************/

    void orientatPonderatCitesteMatricePonderi(ifstream &in) {
        for (int i = 1; i <= m_n; i++) {
            for (int j = 1; j <= m_n; j++) {
                int p;
                in >> p;
                m_ponderatMatrice[i][j] = p;
            }
        }
    }

    void orientatRoyFloydSetup() {
        for (int i = 1; i <= m_n; i++) {
            for (int j = 1; j <= m_n; j++) {
                if (i == j) {
                    m_royFloydDists[i][j] = 0;
                } else if (m_ponderatMatrice[i][j] == 0) {
                    m_royFloydDists[i][j] = INF;
                } else {
                    m_royFloydDists[i][j] = m_ponderatMatrice[i][j];
                }
            }
        }
    }

    void orientatRoyFloyd() {
        orientatRoyFloydSetup();

        for (int k = 1; k <= m_n; k++) {
            for (int i = 1; i <= m_n; i++) {
                for (int j = 1; j <= m_n; j++) {
                    if (m_royFloydDists[i][k] + m_royFloydDists[k][j] < m_royFloydDists[i][j]) {
                        m_royFloydDists[i][j] = m_royFloydDists[i][k] + m_royFloydDists[k][j];
                    }
                }
            }
        }

        for (int i = 1; i <= m_n; i++) {
            for (int j = 1; j <= m_n; j++) {
                if (m_royFloydDists[i][j] == INF) {
                    m_royFloydDists[i][j] = 0;
                }
            }
        }
    }

    const auto &orientatRoyFloydGetDists() {
        return m_royFloydDists;
    }
};

int main() {
    // Input rapid
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    // I/O
    ifstream in("royfloyd.in");
    ofstream out("royfloyd.out");

    int n;
    in >> n;

    Graf g(n, 0);
    g.orientatPonderatCitesteMatricePonderi(in);
    in.close();

    g.orientatRoyFloyd();

    // TODO
    const auto &dists = g.orientatRoyFloydGetDists();
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            out << dists[i][j] << " ";
        }
        out << "\n";
    }

    out.close();
    return 0;
}