Pagini recente » Cod sursa (job #337774) | Cod sursa (job #1442452) | Cod sursa (job #694441) | Cod sursa (job #337769) | Cod sursa (job #3333764)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
int main()
{
int n, m;
f >> n >> m;
// Lista de adiacenta: adj[nod] = vector de (vecin, cost)
vector<vector<pair<int, int>>> adj(n + 1);
for (int i = 0; i < m; i++)
{
int x, y, c;
f >> x >> y >> c;
adj[x].push_back({y, c});
}
// dist[i] = distanta minima de la nodul 1 la nodul i
vector<long long> dist(n + 1, LLONG_MAX);
dist[1] = 0;
// cnt[i] = de cate ori a fost adaugat nodul i in coada
vector<int> cnt(n + 1, 0);
// inQueue[i] = true daca nodul i este in coada
vector<bool> inQueue(n + 1, false);
// SPFA (Shortest Path Faster Algorithm) - optimizare Bellman-Ford
queue<int> q;
q.push(1);
inQueue[1] = true;
cnt[1] = 1;
bool cicluNegativ = false;
while (!q.empty() && !cicluNegativ)
{
int nod = q.front();
q.pop();
inQueue[nod] = false;
for (auto &muchie : adj[nod])
{
int vecin = muchie.first;
int cost = muchie.second;
if (dist[nod] != LLONG_MAX && dist[nod] + cost < dist[vecin])
{
dist[vecin] = dist[nod] + cost;
if (!inQueue[vecin])
{
q.push(vecin);
inQueue[vecin] = true;
cnt[vecin]++;
// Daca un nod a fost adaugat de mai mult de N ori,
// exista un ciclu negativ
if (cnt[vecin] > n)
{
cicluNegativ = true;
break;
}
}
}
}
}
if (cicluNegativ)
{
g << "Ciclu negativ!\n";
}
else
{
for (int i = 2; i <= n; i++)
{
if (dist[i] == LLONG_MAX)
g << 0; // Nu exista drum (conform problemei de la Dijkstra)
else
g << dist[i];
if (i < n)
g << " ";
}
g << "\n";
}
return 0;
}