Pagini recente » Cod sursa (job #1086547) | Cod sursa (job #3235345) | Cod sursa (job #267819) | Cod sursa (job #1913003) | Cod sursa (job #2814887)
#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)
// 2^30-1 ca sa nu fie overflow daca faci INF + INF
const int nMax = 100005;
using namespace std;
class Graf {
private:
int m_n, m_m;
int m_ponderatMatrice[105][105] = {};
int m_royFloydDists[105][105] = {};
public:
explicit Graf(int n = 0, int m = 0) : m_n(n), m_m(m) {}
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();
// Nodul k = nodul pe care incercam sa il integram in drumul de la i la j
for (int k = 1; k <= m_n; k++) {
// Verificam toate drumurile daca pot fi scurtate folosind k drept nod intermediar
// (i -> ... -> k -> ... -> j)
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];
}
}
}
}
}
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;
}