Pagini recente » Cod sursa (job #2969808) | Cod sursa (job #1021087) | Cod sursa (job #828019) | Cod sursa (job #972874) | Cod sursa (job #2784764)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("bfs.in");
ofstream gout("bfs.out");
class Graful_meu
{
int _noduri;
int _muchii;
vector<vector<int>> lista_muchii;
//bool noduri_vizitate[NMAX]; -- in fiecare metoda care are nevoie de el (NU AICI)
public:
Graful_meu(); // daca ni se da lista de adiacenta
int Componente_conexe();
void citire_muchii_neorientat();
int citire_muchii_orientat_cu_nod_start();
void DFS(int start, bool vizitat[]);
void BFS(int start);
};
Graful_meu::Graful_meu()
{
_noduri = 0;
_muchii = 0;
}
void Graful_meu::citire_muchii_neorientat()
{
int x, y;
fin >> _noduri;
fin >> _muchii;
lista_muchii.resize(_noduri+2);
for(int i = 1 ; i <= _muchii ; ++i)
{
fin >> x >> y;
lista_muchii[x].push_back(y);
lista_muchii[y].push_back(x);
}
}
int Graful_meu::citire_muchii_orientat_cu_nod_start()
{
int x, y, nod_start;
fin >> _noduri;
fin >> _muchii;
fin >> nod_start;
lista_muchii.resize(_noduri+2);
for(int i = 1 ; i <= _muchii ; ++i)
{
fin >> x >> y;
lista_muchii[x].push_back(y);
}
return nod_start;
}
void Graful_meu::DFS(int start, bool vizitat[])
{
vizitat[start] = 1;
for(int nod_vecin : lista_muchii[start])
if(vizitat[nod_vecin] == 0)
DFS(nod_vecin, vizitat);
}
int Graful_meu::Componente_conexe()
{
bool vizitat[_noduri + 2] = {0};
int numar_componente_conexe = 0;
for(int i = 1 ; i <= _noduri ; ++i)
if (vizitat[i] == 0)
{
DFS(i, vizitat);
++numar_componente_conexe;
}
return numar_componente_conexe;
}
void Graful_meu::BFS(int start)
{
bool vizitat[_noduri + 2] = {0};
queue<int>coada_BFS;
vector<int> drumuri_minime(_noduri + 2, -1);
coada_BFS.push(start);
vizitat[start] = 1;
drumuri_minime[start] = 0;
while(!coada_BFS.empty())
{
for(int nod_vecin : lista_muchii[start])
if(vizitat[nod_vecin] == 0)
{
coada_BFS.push(nod_vecin);
vizitat[nod_vecin] = 1;
drumuri_minime[nod_vecin] = drumuri_minime[start] + 1;
}
coada_BFS.pop();
start = coada_BFS.front();
}
for(int i = 1 ; i <= _noduri ; ++i)
gout << drumuri_minime[i] << " ";
}
int main()
{
Graful_meu g;
int nod_start = g.citire_muchii_orientat_cu_nod_start();
//gout << g.Componente_conexe();
g.BFS(nod_start);
return 0;
}