Pagini recente » Cod sursa (job #184097) | Cod sursa (job #1235530) | Cod sursa (job #2439679) | Cod sursa (job #1795597) | Cod sursa (job #2792212)
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <list>
#include <queue>
using namespace std;
ifstream f("bfs.in");
ofstream o("bfs.out");
class Graf {
int noduri, muchii;
unordered_map<int, list<int>>vecini;
unordered_map<int, bool> vizitat;
public:
Graf(int n, int m);
int get_noduri();
int get_muchii();
int get_vizitat(int nod);
void adauga_muchie_neorientat(int nod1, int nod2);
void adauga_muchie_orientat(int nod1, int nod2);
void sorteaza();
void dfs(int varf);
void componente_conexe();
void bfs(int varf);
};
Graf::Graf(int n, int m)
{
this -> noduri = n;
this -> muchii = m;
for (int i = 1; i <= n; i++)
vizitat[i] = 0;
}
int Graf::get_noduri()
{
return this -> noduri;
}
int Graf::get_muchii()
{
return this -> muchii;
}
int Graf::get_vizitat(int nod)
{
return vizitat[nod];
}
void Graf::adauga_muchie_neorientat(int nod1, int nod2)
{
vecini[nod1].push_back(nod2);
vecini[nod2].push_back(nod1);
}
void Graf::adauga_muchie_orientat(int nod1, int nod2)
{
vecini[nod1].push_back(nod2);
}
void Graf::sorteaza()
{
for (int i = 1; i <= noduri; i++)
vecini[i].sort();
}
void Graf::dfs(int varf)
{
//cout << varf << " ";
vizitat[varf] = 1;
for (auto i = vecini[varf].begin(); i != vecini[varf].end(); i++)
if (vizitat[*i] != 1)
dfs(*i);
}
void Graf::componente_conexe()
{
int sol = 0;
int N = this -> get_noduri();
this -> sorteaza();
for (int i = 1; i <= N; i++)
if (this -> get_vizitat(i) != 1)
{
sol += 1;
this -> dfs(i);
}
cout << sol;
}
void Graf::bfs(int varf)
{
int start = varf;
queue<int>coada;
vizitat[varf] = 1;
coada.push(varf);
unordered_map<int, int>distanta;
for (int i = 1; i <= noduri; i++)
distanta[i] = 0;
while (coada.size())
{
varf = coada.front();
//cout << varf << " ";
coada.pop();
for(auto i = vecini[varf].begin(); i != vecini[varf].end(); i++)
if (!vizitat[*i])
{
vizitat[*i] = 1;
coada.push(*i);
distanta[*i] = distanta[varf] + 1;
}
}
for (int i = 1; i <= noduri; i++)
if (i != start && distanta[i] == 0)
o << "-1" << " ";
else
o << distanta[i] << " ";
}
int main()
{
int N, M, X;
f >> N >> M >> X;
Graf g(N, M);
for (int i = 1; i <= M; i++)
{
int st, dr;
f >> st >> dr;
g.adauga_muchie_orientat(st, dr);
}
g.bfs(X);
return 0;
}