Pagini recente » Cod sursa (job #442213) | Cod sursa (job #2466696) | Cod sursa (job #969875) | Cod sursa (job #2209312) | Cod sursa (job #942607)
Cod sursa(job #942607)
#include <cstdio>
#include <queue>
#include <climits>
#include <vector>
using namespace std;
#define NMAX 50000
vector<int> g[NMAX + 1];
vector<int> c[NMAX + 1];
queue<int> q;
int d[NMAX + 1];
bool inqueue[NMAX + 1];
int cnt[NMAX + 1];
int n, m;
void read() {
scanf("%d%d\n", &n, &m);
for(int i = 0; i < m; i++) {
int x, y, cst;
scanf("%d%d%d\n", &x, &y, &cst);
g[x].push_back(y);
c[x].push_back(cst);
}
}
void bellman_ford(int s) {
for(int i = 1; i <= n; i++) d[i] = INT_MAX;
d[s] = 0;
q.push(s);
inqueue[s] = true;
bool cycle = false;
while(q.size() > 0) {
int u = q.front();
q.pop();
inqueue[u] = false;
cnt[u]++;
if(cnt[u] > n) {
cycle = true;
break;
}
for(size_t i = 0; i < g[u].size(); i++) {
int v = g[u][i];
int cuv = c[u][i];
if(d[v] > d[u] + cuv) {
d[v] = d[u] + cuv;
if(!inqueue[v]) {
q.push(v);
inqueue[v] = true;
}
}
}
}
if(cycle) printf("Ciclu negativ!\n");
else {
for(int i = 2; i <= n; i++) {
printf("%d ", d[i]);
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
freopen("bellmanford.in", "r", stdin);
freopen("bellmanford.out", "w", stdout);
read();
bellman_ford(1);
return 0;
}