Pagini recente » Monitorul de evaluare | Cod sursa (job #1054983) | Cod sursa (job #328448) | Cod sursa (job #3262208) | Cod sursa (job #2424040)
// detectie ciclu negativ
// complexitate O(n*m)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
vector <vector <pair <int, int> > > v;
queue <int> q;
int n, m;
vector<int> bellmanford(int start) {
vector <int> d(n + 1, INF);
vector <bool> inq(n + 1, false);
vector <int> seen(n + 1, 0);
q.push(start);
inq[start] = true;
d[start] = 0;
seen[start] = 1;
while (!q.empty()) {
int k = q.front();
q.pop();
inq[k] =false;
for (int i = 0; i < v[k].size(); i++) {
if (d[k] + v[k][i].second < d[v[k][i].first]) {
d[v[k][i].first] = d[k] + v[k][i].second;
seen[v[k][i].first] ++;
if (seen[v[k][i].first] == n - 1) {
d[0] = -1;
return d;
}
if (!inq[v[k][i].first]) {
inq[v[k][i].first] = true;
q.push(v[k][i].first);
}
}
}
}
return d;
}
int main() {
ifstream cin("bellmanford.in");
ofstream cout("bellmanford.out");
cin >> n >> m;
v.resize(n + 1);
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
v[a].push_back(make_pair(b, c));
}
vector<int> sol = bellmanford(1);
if (sol[0] == -1) {
cout << "Ciclu negativ!";
return 0;
}
for (int i = 2; i <= n; i++) {
cout << sol[i] << " ";
}
return 0;
}