Pagini recente » Cod sursa (job #659994) | Cod sursa (job #660227) | Cod sursa (job #55833) | Cod sursa (job #2519426) | Cod sursa (job #2656085)
#include <iostream>
#include <fstream>
#include <tuple>
#include <vector>
#include <queue>
#include <set>
using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");
queue<int> deViz;
set<int> elemViz;
void parcurgereBFS(vector<int> *listaDeArce, int distPunctAles[], int &distanta) {
// Retin valoarea ultimului element al cozii . Cand intalmim aceea valoare la inceput marim distanta, iar atunci retinem valoarea
int deCres = deViz.back();
while (deViz.empty() == 0) {
// Luam primul element din coada
int prElem = deViz.front();
// Verificam daca este in set-ul de elemente parcurse
if (elemViz.find(prElem) == elemViz.end()) {
elemViz.insert(prElem);
distPunctAles[prElem] = distanta;
// Iteram prin vectorul de arce al nodului respectiv si le puncem in coada daca nu au fost vizitate
for (int i = 0; i < listaDeArce[prElem].size(); i++) {
int elemVecin = listaDeArce[prElem][i];
if (elemViz.find(elemVecin) == elemViz.end())
deViz.push(listaDeArce[prElem][i]);
}
}
if (deCres == prElem) {
distanta++;
deCres = deViz.back();
}
deViz.pop();
}
}
int main() {
int n, m, s;
f >> n >> m >> s;
// Trebuie sa facem o lista de arce per nod: 1: 2,3
vector<int> listaDeArce [n+1];
int distPctAles[n+1];
for (int i = 1; i<= n; i++)
distPctAles[i] = -1;
for (int i = 1; i <= n; i++) {
vector<int> temp;
listaDeArce[i] = temp;
}
for (int i = 0; i < m; i++) {
int source, destination;
f>>source;
f>>destination;
listaDeArce[source].emplace_back(destination);
}
deViz.push(s);
int distanta = 0;
parcurgereBFS(listaDeArce, distPctAles, distanta);
for (int i = 1; i <= n; i++)
g<<distPctAles[i]<<' ';
f.close();
g.close();
return 0;
}