Cod sursa(job #3219915)

Utilizator thinkphpAdrian Statescu thinkphp Data 1 aprilie 2024 19:46:25
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <queue>
#include <cstring>
#define FIN "bfs.in"
#define FOUT "bfs.out"
#define SIZE 500001

using namespace std;

int dist[SIZE];
bool visited[SIZE];
vector<int> Adj_List[SIZE];
queue<int> Queue;
int num_nodes,
    num_edges,
    source;

void read_graph() {

     int x,y;

     freopen(FIN, "r", stdin);

     scanf("%d %d %d", &num_nodes, &num_edges, &source);
     //printf("%d %d %d", num_nodes, num_edges, source);

     for(;num_edges;num_edges--) {
          scanf("%d %d", &x, &y);
          Adj_List[x].push_back(y);
     }
}

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 = Adj_List[ node ].begin(); it != Adj_List[node].end(); ++it) {

               if(!visited[ *it ]) {

                 visited[ *it ] = true;
                 Queue.push( *it );
                 dist[*it] = dist[ node ] + 1;

               }
           }
     }
}

void write_solution() {

      freopen(FOUT, "w", stdout);

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

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

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

          else printf("-1 ");
      }
}

int main() {

    read_graph();
    BFS();
    write_solution();
}