Pagini recente » Cod sursa (job #1037674) | Cod sursa (job #2179132) | Cod sursa (job #2491177) | Cod sursa (job #3130163) | Cod sursa (job #2592081)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
const int MAX_N = 2001;
typedef pair<int, int> Edge;
vector<Edge> edges[MAX_N];
const bool CITIRE_PRIN_MATRICE_DE_ADIACENTA = true;
int n;
int delta[MAX_N];
int viz[MAX_N];
void bellman() {
queue<int> q;
for (int i = 1; i <= n; i++)
q.push(i);
while (q.size()) {
int i = q.front();
q.pop();
if (++viz[i] > n) {
cout << "Cicluri negative!" << endl;
exit(0);
}
for (Edge e : edges[i]) {
if (delta[e.second] > delta[i] + e.first) {
delta[e.second] = delta[i] + e.first;
q.push(e.second);
}
}
}
}
void update_edges() {
for (int i = 1; i <= n; i++)
for (int j = 0; j < edges[i].size(); j++)
edges[i][j].first += delta[i] - delta[edges[i][j].second];
}
int dist[MAX_N][MAX_N];
void dijkstra(int s, int* d) {
for (int i = 1; i <= n; i++)
d[i] = -1;
priority_queue<Edge, vector<Edge>, greater<Edge>> q;
q.push({0, s});
while (q.size()) {
int dst = q.top().first, u = q.top().second;
q.pop();
if (d[u] != -1)
continue;
d[u] = dst;
for (Edge e : edges[u])
if (d[e.second] == -1)
q.push({dst + e.first, e.second});
}
for (int i = 1; i <= n; i++)
d[i] += delta[i] - delta[s];
}
int main() {
ifstream cin("royfloyd.in");
ofstream cout("royfloyd.out");
cin >> n;
if (CITIRE_PRIN_MATRICE_DE_ADIACENTA) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
int x;
cin >> x;
if (x)
edges[i].push_back({x, j});
}
} else {
int m, a, b, c;
cin >> m;
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
edges[a].push_back({c, b});
}
}
bellman();
update_edges();
for (int i = 1; i <= n; i++)
dijkstra(i, dist[i]);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cout << max(0, dist[i][j]) << ' ';
cout << endl;
}
return 0;
}