Pagini recente » Cod sursa (job #1776904) | Cod sursa (job #2114842) | Cod sursa (job #2969160) | Cod sursa (job #2088950) | Cod sursa (job #2036598)
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 50001
#define INF 2000000000
using namespace std;
vector < pair < int, int > > v[nmax];
queue <int> coada;
int dist[nmax];
void init( int nr_nod, int nod_start ) {
for ( int i = 1; i <= nr_nod; i++ )
dist[i] = INF;
dist[nod_start] = 0;
}
void bellmanford( int nr_nod, int nr_muchii, int nod_start ) {
int co, ok;
init( nr_nod, nod_start );
coada.push( nod_start );
co = 0;
ok = 1;
while( coada.empty() == 0 && ok == 1 ) {
for ( int i = 0; i < v[ coada.front() ].size(); i++ ) {
if( dist[ coada.front() ] + v[coada.front()][i].second < dist[ v[coada.front()][i].first ] ) {///daca drumul e mai mic
dist[ v[coada.front()][i].first ] = dist[ coada.front() ] + v[ coada.front() ][i].second;
coada.push( v[coada.front()][i].first );
}
}
coada.pop();
co++;
if( 1LL * co == 1LL * nr_nod * nr_muchii ) ///daca depasim acest nr de pasi
ok = 0; ///avem ciclu negativ
}
}
bool verif( int nod_start, int nr_nod ) {
for( int i = 1; i <= nr_nod; i++ ) {
for( int j = 0; j < v[i].size(); j++ ) {
if( dist[ i ] + v[i][j].second < dist[ v[i][j].first ] ) ///daca se poate face un drum mai mic, inseamna ca avem ciclu negativ
return false;
}
}
return true;
}
int main() {
int nr_nod, nr_muchii, i, x, y, c;
FILE *fin, *fout;
fin = fopen( "bellmanford.in", "r" );
fscanf( fin, "%d%d", &nr_nod, &nr_muchii );
for ( i = 0; i < nr_muchii; i++ ) {
fscanf( fin, "%d%d%d", &x, &y, &c );
v[x].push_back( { y, c } );
}
fclose( fin );
bellmanford( nr_nod, nr_muchii, 1 );
fout = fopen( "bellmanford.out", "w" );
if( verif( 1, nr_nod ) == false )
fprintf( fout, "Ciclu negativ!\n" );
else{
for( i = 2; i <= nr_nod; i++ )
fprintf( fout, "%d ", dist[i] );
fputc( '\n', fout );
}
fclose( fout );
return 0;
}