Pagini recente » Cod sursa (job #671552) | Cod sursa (job #1284883) | Cod sursa (job #524042) | Cod sursa (job #1333183) | Cod sursa (job #2260396)
#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>
#define NMAX 50001
#define INFINIT 1001
struct ind {
int nod ;
int cost ;
};
using namespace std;
queue <ind> q ;
vector <ind> mat [ NMAX + 1 ] ;
int dist [ NMAX + 1 ] ;
void bellmanford (int s, int n ) {
q.push({1, 0}) ;
dist[1] = 0 ;
for (int i = 2 ; i <= n ; i++ ) {
q.push ({i, INFINIT}) ;
dist[i] = INFINIT ;
}
while (!q.empty()) {
ind first = q.front() ;
q.pop() ;
for (ind elem : mat[first.nod] ) {
if (dist[first.nod] + elem.cost < dist[elem.nod] ) {
dist[elem.nod] = dist[first.nod] + elem.cost ;
q.push({first.nod, dist[elem.nod]}) ;
}
}
}
}
int main() {
FILE *fin, *fout ;
fin = fopen ("bellmanford.in", "r" ) ;
fout = fopen ("bellmanford.out", "w" ) ;
int n, a, b, c, m, ok, i ;
fscanf (fin, "%d%d", &n, &m ) ;
for (i = 0 ; i < m ; i++ ) {
fscanf (fin, "%d%d%d", &a, &b, &c ) ;
mat[a].push_back({b, c}) ;
}
bellmanford(1, n) ;
ok = 0 ;
for (i = 1 ; i <= n ; i++ ) {
for (ind elem : mat[i] )
if (dist[elem.nod] > elem.cost + dist[i] )
ok = 1 ;
}
if (ok == 1 )
fprintf (fout, "Ciclu negativ!" ) ;
else
for (i = 2 ; i <= n ; i++ )
fprintf (fout, "%d ", dist[i] ) ;
return 0;
}