Pagini recente » Cod sursa (job #846211) | Cod sursa (job #879914) | Cod sursa (job #419398) | Cod sursa (job #785486) | Cod sursa (job #3319501)
// https://www.infoarena.ro/problema/bellmanford - Szücs Patrik - Kevin
#include <fstream>
#include <vector>
#include <climits>
struct edge
{
int from, to, price;
};
int main()
{
std::ifstream in("bellmanford.in");
std::ofstream out("bellmanford.out");
int n, m;
in >> n >> m;
std::vector<edge> edges(m);
for (int i = 0; i < m; i++)
in >> edges[i].from >> edges[i].to >> edges[i].price;
in.close();
std::vector<int> dist(n + 1, INT_MAX);
dist[1] = 0;
// Bellman-Ford
bool changed;
for (int i = 1; i < n; i++)
{
changed = false;
for (auto &e : edges)
if (dist[e.from] != INT_MAX && dist[e.from] + e.price < dist[e.to])
{
dist[e.to] = dist[e.from] + e.price;
changed = true;
}
if (!changed)
break; // gyorsítás
}
for (auto &e : edges)
if (dist[e.from] != INT_MAX && dist[e.from] + e.price < dist[e.to])
{
out << "Ciclu negativ\n";
return 0;
}
for (int i = 2; i <= n; i++)
out << (dist[i] == INT_MAX ? 0 : dist[i]) << ' ';
out.close();
return 0;
}