Pagini recente » Cod sursa (job #1968762) | Cod sursa (job #1128427) | Cod sursa (job #1627141) | Cod sursa (job #521682) | Cod sursa (job #2787587)
#include <fstream>
#include <vector>
#define maxi 100001
using namespace std;
ifstream fin("bfs.in");
ofstream fout("bfs.out");
class Graf {
int nrNoduri, nrMuchii;
int vizitat2[100001], coada[100001];
int pozitiePlecare, pozitieUltima;
vector<int> *adiacenta; // lista de vecini
// int **matriceAdiacenta;
public:
Graf();
void BFS(int nodPlecare);
void DFS(int nodPlecare);
void citire2(int &nodPlecare);
void BFS2(int nodPlecare);
void afisareCoada2();
void citire();
void afisare();
void afisareCoada();
~Graf();
};
// neorientat
Graf::Graf() {
// matriceAdiacenta = new int *[nrNoduri]; /// tabloul pointerilor de linii
// for (int i = 0; i < nrNoduri; i++)
// matriceAdiacenta[i] = new int[nrNoduri]; /// tabloul valorilor din linie
adiacenta = new vector<int>[maxi];
for (int i = 1; i <= maxi; i++)
vizitat2[i] = -1;
pozitiePlecare = pozitieUltima = 1;
// coada[1] = 2;
// vizitat[2] = 1;
}
Graf::~Graf() {
delete[] adiacenta;
}
void Graf::citire2(int &nodPlecare) {
int x, y;
fin >> nrNoduri >> nrMuchii >> nodPlecare;
for (int i = 1; i <= nrMuchii; i++) {
fin >> x >> y;
adiacenta[x].push_back(y);
//adiacenta[y].push_back(x);
}
coada[1] = nodPlecare;
vizitat2[coada[1]] = 1;
}
void Graf::BFS2(int pozitiePlecare) {
int nodPlecare = coada[pozitiePlecare]; // retin nodul de unde plec
for (int j = 0; j < adiacenta[nodPlecare].size(); j++)
if (vizitat2[adiacenta[nodPlecare][j]] == -1) {
// caut toate nodurile nevizitate care sunt adiacente cu nodul de plecare
vizitat2[adiacenta[nodPlecare][j]] = vizitat2[nodPlecare] + 1; // il marcam vizitat
pozitieUltima++; // indexez pozitia ultimului element din coada
coada[pozitieUltima] = adiacenta[nodPlecare][j]; // il adaug in coada PUSH
}
if (pozitiePlecare < pozitieUltima) // daca mai sunt elemente in coada / nu am verificat pt toate nodurile
BFS2(pozitiePlecare + 1);
}
void Graf::afisareCoada2() {
for (int i = 1; i <= nrNoduri; i++) {
if (vizitat2[i] != -1)
fout << vizitat2[i] - 1 << " ";
else
fout << -1 << " ";
}
}
int main() {
int nodPlecare;
Graf g1;
g1.citire2(nodPlecare);
g1.BFS2(1);
g1.afisareCoada2();
return 0;
}