Cod sursa(job #1229596)

Utilizator thinkphpAdrian Statescu thinkphp Data 17 septembrie 2014 19:44:30
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define FIN "bfs.in"
#define FOUT "bfs.out"
#define MAX 500001
#define pb push_back

using namespace std;

int dist[ MAX ];
bool visited[ MAX ];
vector<int> Adjacency_List[ MAX ];
queue<int> Queue;
int num_nodes, 
    num_arcs,
    source;

//function prototypes
void readGraph();
void BFS();
void write();
void adjacency();

int main() {

    readGraph();
    BFS();
    write();

    return 0;
};

void readGraph() {
 
    int x,
        y;

    freopen(FIN, "r", stdin);

    scanf("%d %d %d", &num_nodes, &num_arcs, &source);

    for(; num_arcs; num_arcs--) {

          scanf("%d %d", &x, &y);

          Adjacency_List[ x ].pb( y );    
    } 

    fclose( stdin ); 
};

void BFS() {

     int node;

     for(int k = 1; k <= num_nodes; k++)  dist[ k ] = 0, visited[ k ] = false;
 
     visited[ source ] = true;

     Queue.push( source );

     while( !Queue.empty() ) {

             node = Queue.front();

             visited[ node ] = true; 

             Queue.pop();

             for(vector<int>::iterator it = Adjacency_List[ node ].begin(); it != Adjacency_List[ node ].end(); ++it) {

                              if( !visited[ *it ] ) {
 
                                   visited[ *it ] = true;

                                   Queue.push( *it );

                                   dist[ *it ] = dist[ node ] +  1;      
                              }
             }
     }
};

void write() {

     freopen(FOUT, "w", stdout);

     for(int k = 1; k <= num_nodes; k++) {

             if(dist[ k ]) printf("%d ", dist[k]);

                    else if(k == source && dist[k] == 0) printf("0 ");

                         else printf("-1 ");
     }

    fclose( stdout ); 
};