Pagini recente » Cod sursa (job #2362962) | Cod sursa (job #499808) | Cod sursa (job #1556433) | Cod sursa (job #2622413) | Cod sursa (job #2789403)
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <vector>
#include <queue>
#include <list>
using namespace std;
ifstream fin("bfs.in");
ofstream fout("bfs.out");
class Graf
{
int nrNoduri;
int nrMuchii;
bool orientat;
vector<vector<int>> listaAdiacenta;
public:
Graf(bool o)
{
nrNoduri = 0;
nrMuchii = 0;
orientat = o;
}
Graf(int n, int m, bool o)
{
nrNoduri = n;
nrMuchii = m;
orientat = o;
}
void citireGraf()
{
int x, y;
if(orientat)
for (int i = 0; i < nrMuchii; i++)
{
fin >> x >> y;
listaAdiacenta[x].push_back(y);
}
else
for (int i = 0; i < nrMuchii; i++)
{
fin >> x >> y;
listaAdiacenta[x].push_back(y);
listaAdiacenta[y].push_back(x);
}
}
void distanteBFS(int nodS)
{
vector<bool> vizitat(nrNoduri + 1, false);
vector<int> distanta(nrNoduri + 1, -1);
BFS(nodS, vizitat, distanta);
for (int i = 1; i <= nrNoduri; i++)
fout << distanta[i] << " ";
}
private:
void BFS(int nodS, vector<bool>& vizitat, vector<int>& distanta)
{
queue<int> queue;
queue.push(nodS);
vizitat[nodS] = true;
distanta[nodS] = 0;
while (!queue.empty())
{
int nodCurent = queue.front();
//fout << nodCurent << " ";
queue.pop();
for (int vecin : listaAdiacenta[nodCurent])
if (!vizitat[vecin])
{
queue.push(vecin);
vizitat[vecin] = true;
distanta[vecin] = distanta[nodCurent] + 1;
}
}
}
};
int main()
{
int n, m, s;
fin >> n >> m >> s;
Graf G(n, m, true);
G.citireGraf();
G.distanteBFS(s);
}