Pagini recente » Cod sursa (job #1922533) | Diferente pentru jc2016 intre reviziile 5 si 4 | Monitorul de evaluare | Cod sursa (job #306692) | Cod sursa (job #3325327)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INFINIT = 1000000000;
int main() {
int n, s;
if (!(cin >> n >> s)) return 0;
vector<vector<int>> a(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
cin >> a[i][j];
vector<int> d(n + 1, INFINIT), f(n + 1, 0);
// nodul sursa este s
for (int i = 1; i <= n; ++i) {
f[i] = 0;
d[i] = a[s][i];
}
f[s] = 1;
d[s] = 0;
for (int i = 1; i <= n; ++i) { d[i] = INFINIT; f[i] = 0; }
d[s] = 0;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
pq.emplace(0, s);
while (!pq.empty()) {
auto [dist, u] = pq.top(); pq.pop();
if (dist != d[u]) continue;
if (f[u]) continue;
f[u] = 1;
for (int v = 1; v <= n; ++v) {
if (f[v] == 0 && d[v] > d[u] + a[u][v]) {
d[v] = d[u] + a[u][v];
pq.emplace(d[v], v);
}
}
}
for (int i = 1; i <= n; ++i)
f[i] = 1;
for (int k = 1; k < n; ++k) {
int pmax = 0;
for (int i = 1; i <= n; ++i)
if (f[i] == 0 && d[i] < d[pmax])
pmax = i;
if (pmax != 0 && d[pmax] < INFINIT) {
f[pmax] = 1;
for (int i = 1; i <= n; ++i)
if (f[i] == 0 && d[i] > d[pmax] + a[pmax][i])
d[i] = d[pmax] + a[pmax][i];
} else {
break;
}
}
// afisare
for (int i = 1; i <= n; ++i) {
if (d[i] >= INFINIT) cout << "INF";
else cout << d[i];
if (i < n) cout << ' ';
}
cout << '\n';
return 0;
}