Pagini recente » dot-com/2012/clasament | Diferente pentru preoni-2007/runda-2/solutii intre reviziile 35 si 34 | Diferente pentru concurs-mihai-patrascu-2013 intre reviziile 15 si 13 | Cod sursa (job #1982384) | Cod sursa (job #2425564)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int INFI = 0X3F3F3F;
const int NMAX = 50001;
int Cnt[ NMAX ],
D[ NMAX ],
InQ[ NMAX ];
struct Muchie {
int nod, cost;
};
vector < Muchie > V[ NMAX ];
bool Bellman_Ford ( int start, int n ) {
int i, j;
queue < int > Q;
for ( int i = 0; i <= n; ++i ) {
D[ i ] = INFI;
}
Q.push( start );
D[ start ] = 0;
while ( !Q.empty() ) {
int nod = Q.front();
Q.pop();
InQ[ nod ] = 0;
if ( Cnt[ nod ] > n ) {
return false;
}
Cnt[ nod ]++;
for ( i = 0; i < V[ nod ].size(); ++i ) {
int fiu = V[ nod ][ i ].nod;
int cost = V[ nod ][ i ].cost;
if ( D[ fiu ] > D[ nod ] + cost ) {
D[ fiu ] = D[ nod ] + cost;
if ( !InQ[ fiu ] ) {
Q.push( fiu );
InQ[ fiu ] = 1;
}
}
}
}
return true;
}
int main () {
freopen( "bellmanford.in", "r", stdin );
freopen( "bellmanford.out", "w", stdout );
int n, m;
int x, y, c;
scanf( "%d%d", &n,&m );
while ( m-- ) {
scanf( "%d%d%d", &x,&y,&c );
V[ x ].push_back( { y, c } );
}
if ( !Bellman_Ford( 1, n ) ) {
printf("Ciclu negativ!");
} else {
for ( int i = 2; i <= n; ++i )
printf( "%d ", D[ i ] );
}
return 0;
}