Cod sursa(job #1481393)

Utilizator thinkphpAdrian Statescu thinkphp Data 4 septembrie 2015 12:55:15
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cstdio>
#include <deque>
#include <vector>
#define FIN "bellmanford.in"
#define FOUT "bellmanford.out"
#define oo ((1LL<<31) - 1)
#define MAXN 50001
#define nodeY it->first
#define cost it->second

using namespace std;

vector< pair<int, int> > VEC[ MAXN ];

deque< int > Queue;

int A,
    B,
    C,
    dist[ MAXN ], 
    vis [ MAXN ],
    count[ MAXN ], 
    nodeX,     
    nodes,
    edges;         

FILE *fout = fopen(FOUT, "w"); 

void readData();
void BellmanFord();
void writeData();

int main() {

 readData();
 BellmanFord(); 
 writeData();

 return(0); 
};

void readData() {       

     FILE *fin = fopen(FIN, "r");

     fscanf(fin, "%d %d", &nodes, &edges);

     for( ;edges; edges--){

          fscanf(fin, "%d %d %d", &A, &B, &C);

          VEC[ A ].push_back( make_pair( B, C) ); 
     } 

     fclose( fin ); 
};

void BellmanFord() {

     vector< pair <int, int> >::iterator it;

     for(int i = 2; i <= nodes; i++) dist[ i ] = oo;

     dist[ 1 ] = 0;

     Queue.push_back( 1 );

     for( ; Queue.size(); ) {

            nodeX = Queue.front();

            for(it = VEC[ nodeX ].begin(); it != VEC[ nodeX ].end(); ++it ) {

                if( dist[ nodeY ] >  dist[ nodeX ] + cost) { 

                    dist[ nodeY ] =  dist[ nodeX ] + cost;

                    if(!vis[ nodeY ]) {

                       if( ++count[ nodeY ] > nodes ) { 

                             fprintf(fout, "%s", "Ciclu negativ!"); 

                             return;
                       }

                       Queue.push_back( nodeY );  

                       vis[ nodeY ] = 1;
                    }                    
                }
                    
            }

            Queue.pop_front();

            vis[ nodeX ] = 0;
     }
};

void writeData() {

     for(int j = 2; j <= nodes; j++) fprintf(fout, "%d ", dist[ j ]);  

     fclose( fout ); 

};