Pagini recente » Cod sursa (job #1114149) | Cod sursa (job #722275) | Cod sursa (job #1871437) | Cod sursa (job #421160) | Cod sursa (job #3242374)
#include <fstream>
#include <queue>
using namespace std;
using PII = pair<int, int>;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
static constexpr int nMAX = ((int)(5e4) + 1),
INF = ((int)(1e9));
int n;
vector<PII> G[nMAX];
static void add_edge(const int u, const int v, const int w)
{
G[u].push_back({w, v});
return;
}
static void read()
{
f.tie(nullptr);
int m = 0;
f >> n >> m;
for (int i = 1; i <= m; ++i)
{
int u = 0, v = 0, w = 0;
f >> u >> v >> w;
add_edge(u, v, w);
}
return;
}
int main()
{
read();
queue<int> Q = {};
vector<bool> in_queue((n + 1), false);
vector<int> d((n + 1), INF);
vector<int> counts((n + 1), 0);
Q.push(1), in_queue[1] = true, d[1] = 0, counts[1] = 1;
while (!Q.empty())
{
int node = Q.front();
Q.pop();
in_queue[node] = false;
for (const PII &it : G[node])
if (d[node] + it.first < d[it.second])
{
d[it.second] = d[node] + it.first;
if (in_queue[it.second])
continue;
++counts[it.second];
if (counts[it.second] >= n)
{
g << "Ciclu negativ!\n";
exit(0);
}
Q.push(it.second), in_queue[it.second] = true;
}
}
for (int i = 2; i <= n; ++i)
{
g << ((d[i] == INF) ? (-1) : d[i]);
if (i == n)
g << '\n';
else
g << ' ';
}
return 0;
}