Cod sursa(job #1383272)

Utilizator laurenttlaurentiu pavel laurentt Data 10 martie 2015 05:00:12
Problema BFS - Parcurgere in latime Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<vector>
#include<algorithm>
#include<fstream>
#include<iostream>
#include<queue>
#include<set>
using namespace std;

vector<int> adj[100004];
queue<pair<int, int> > Q;
set<int> visited;

void clear( queue<pair<int, int> > &q )
{
  queue<pair<int,int> > empty;
  swap( q, empty );
}

int bfs(int start, int end) {
  if(start == end) {
    return 0;
  }
  int depth = 1;

  visited.insert(start);
  int v_size = adj[start].size();
  for(int i = 0; i < v_size; ++i) {
    Q.push(make_pair(adj[start][i], depth));
    visited.insert(adj[start][i]);
  }
  //  cout << "\n start:" << start << "\n";
  while(!Q.empty()) {
    pair<int, int> el = Q.front(); Q.pop();
    int currentNode = el.first;
    int currentDepth = el.second;
    //    cout << " cN:" << currentNode << " cD:" << currentDepth << "\n";
    if(currentNode == end) {
      clear(Q);
      visited.clear();
      return currentDepth;
    }
    else {
      v_size = adj[currentNode].size();
      for(int i = 0; i < v_size; ++i) {
	if(visited.find(adj[currentNode][i]) == visited.end()){
	  Q.push(make_pair(adj[currentNode][i], currentDepth + 1));
	  visited.insert(currentNode);
	}
      }
    }
  }
  visited.clear();
  return -1; // should never happen
}

int main() {
  ifstream fin("bfs.in");
  ofstream fout("bfs.out");
  
  int N,M,S; fin >> N >> M >> S;
  for(int i = 0; i < M; ++i) {
    int from,to; fin >> from >> to;
    adj[from].push_back(to);
  }
  
  fout << bfs(1,S);
  for(int i = 2; i <= N; ++i) {
    fout << " " << bfs(S, i);
  }
  fout << "\n";
  
  return 0;
}