Pagini recente » Clasament antrenament | Cod sursa (job #153250) | Cod sursa (job #1704196) | Cod sursa (job #1153166) | Cod sursa (job #2814881)
#include <iostream>
#include <list>
#include <queue>
#include <vector>
#include <stack>
#include <fstream>
#include <map>
#include <set>
#include <algorithm>
#include <climits>
#include <cstring>
#define INF 1 << 30 - 1
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;
}