Pagini recente » Cod sursa (job #796651) | Cod sursa (job #17372) | Cod sursa (job #2841785) | Cod sursa (job #2243072) | Cod sursa (job #2787546)
#include <bits/stdc++.h>
const int 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[10000];
// 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
for (int i = 1; i <= maxi; i++)
vizitat2[i] = -1;
pozitiePlecare = pozitieUltima = 1;
// coada[1] = 2;
// vizitat[2] = 1;
}
Graf::~Graf()
{
// for (int i = 0; i < nrNoduri; i++)
// delete[] matriceAdiacenta[i];
// delete[] matriceAdiacenta;
}
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;
}