Cod sursa(job #1805466)

Utilizator Mihai96Saru Mihai Mihai96 Data 13 noiembrie 2016 21:20:55
Problema BFS - Parcurgere in latime Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <iterator>

using namespace std;

struct Nod {
  int distanta;
  bool vizitat;
  list<int> idNoduriAdiacente;

  Nod() {
    distanta = -1;
    vizitat = false;
  }
};

class Graf {
public:
  Graf(vector<Nod> &noduri);
  void calculeazaDistanteleLaToateNodurileDeLaNodul(int idNodSursa);
  vector<int> getDistante();
private:
  void viziteazaNodurileAdiacenteNodului(int idNod);
  void viziteazaNod(int idNod, int idNodSursa);
  vector<Nod> noduri;
  queue<int> deVizitat;
};

Graf::Graf(vector<Nod> &noduri) {
  this->noduri = noduri;
}

void Graf::viziteazaNod(int idNod, int idNodSursa) {
  noduri[idNod].vizitat = true;
  noduri[idNod].distanta = noduri[idNodSursa].distanta + 1;
}

void Graf::viziteazaNodurileAdiacenteNodului(int idNod) {
  list<int>::iterator idNodIteratie;
  idNodIteratie = noduri[idNod].idNoduriAdiacente.begin();
  while (idNodIteratie != noduri[idNod].idNoduriAdiacente.end()) {
    if (!noduri[*idNodIteratie].vizitat) {
      viziteazaNod(*idNodIteratie, idNod);
      deVizitat.push(*idNodIteratie);
    }
    ++idNodIteratie;
  }
}

void Graf::calculeazaDistanteleLaToateNodurileDeLaNodul(int idNodSursa) {
  noduri[idNodSursa].vizitat = true;
  noduri[idNodSursa].distanta = 0;
  deVizitat.push(idNodSursa);
  while (!deVizitat.empty()) {
    int idNodCurent = deVizitat.front();
    deVizitat.pop();
    viziteazaNodurileAdiacenteNodului(idNodCurent);
  }
}

vector<int> Graf::getDistante() {
  vector<int> distante(noduri.size() - 1);
  for (int i = 0; i < distante.size(); ++i) {
    distante[i] = noduri[i + 1].distanta;
  }
  return distante;
}

int main(int argc, char *argv[]) {
  ifstream fin("bfs.in");
  int n, m, s;
  fin >> n >> m >> s;
  vector<Nod> noduri(n+1);
  int i = 0;
  while (i < m) {
    int x, y;
    fin >> x;
    fin >> y;
    noduri[x].idNoduriAdiacente.push_back(y);
    i += 1;
  }
  fin.close();

  Graf graf(noduri);
  ofstream fout("bfs.out");
  graf.calculeazaDistanteleLaToateNodurileDeLaNodul(s);
  vector<int> distante = graf.getDistante();
  for (unsigned i = 0; i < distante.size() - 1; ++i) {
    fout << distante[i] << " ";
  }
  fout << distante[distante.size() - 1] << "\n";
  fout.close();

  return 0;
}