Pagini recente » Cod sursa (job #1241449) | Cod sursa (job #3286663) | Cod sursa (job #2696866) | Cod sursa (job #1513661) | Cod sursa (job #2657645)
#include <iostream>
#include <fstream>
#include <tuple>
#include <vector>
#include <queue>
#include <bitset>
#define nmax 100001
using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");
bitset<nmax> elemViz;
queue<int> deViz;
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
distPunctAles[prElem] = distanta;
// Iteram prin vectorul de arce al nodului respectiv si le puncem in coada daca nu au fost vizitate
for (unsigned int i = 0; i < listaDeArce[prElem].size(); i++) {
int elemVecin = listaDeArce[prElem][i];
if (elemViz[elemVecin] == 0) {
elemViz[elemVecin] = 1;
deViz.push(elemVecin);
}
}
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 = 0; i < m; i++) {
int source, destination;
f >> source;
f >> destination;
listaDeArce[source].emplace_back(destination);
}
deViz.push(s);
int distanta = 0;
elemViz[s] = 1;
parcurgereBFS(listaDeArce, distPctAles, distanta);
for (int i = 1; i <= n; i++)
g << distPctAles[i] << ' ';
// Am mod. fisierul de intrare si afisarea
f.close();
g.close();
return 0;
}