Pagini recente » Cod sursa (job #1949532) | Cod sursa (job #2500138) | Cod sursa (job #106573) | Cod sursa (job #3259219) | Cod sursa (job #2798252)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("bfs.in");
ofstream out("bfs.out");
class graf{
private:
int NrMuchii, NrNoduri;
bool eOrientat;
vector<vector<int>> adiacenta;
public:
graf(int NrNod = 0, int NrMuc = 0, bool orientat = false){
this->NrNoduri = NrNod;
this->NrMuchii = NrMuc;
this->eOrientat = orientat;
}
~graf(){
this->NrNoduri = 0;
this->NrMuchii = 0;
}
void setNrNoduri(int&);
void setNrMuchii(int&);
void setMuchii(int, int);
int getNrNoduri();
int getNrMuchii();
void citireMuchii();
void BFS(int, bool[], int[]);
void DFS(int, bool[]);
int NrComponenteConexe(bool[]);
};
void graf::setNrNoduri(int &n){
NrNoduri = n;
}
void graf::setNrMuchii(int &m){
NrMuchii = m;
}
void graf::setMuchii(int nod1, int nod2){
adiacenta[nod1].push_back(nod2);
}
int graf::getNrNoduri(){
return NrNoduri;
}
int graf::getNrMuchii(){
return NrMuchii;
}
void graf::citireMuchii(){
int n1, n2;
adiacenta.resize(NrNoduri + 1);
for(int i = 0; i < NrMuchii; i++){
in>>n1>>n2;
setMuchii(n1, n2);
if(!eOrientat){
setMuchii(n2, n1);
}
}
}
void graf::BFS(int NodSursa, bool vizitat[], int distanta[]){
queue<int> coada;
coada.push(NodSursa);
vizitat[NodSursa] = true;
while(!coada.empty()){
for(int nod : adiacenta[coada.front()]){
if(!vizitat[nod]){
vizitat[nod] = true;
coada.push(nod);
distanta[nod] = distanta[coada.front()] + 1;
}
}
coada.pop();
}
for(int nod = 1; nod <= NrNoduri; nod++){
if((NodSursa != nod) && (distanta[nod] == 0)){
out<<"-1 ";
}
else{
out<<distanta[nod]<<" ";
}
}
}
void graf::DFS(int Nod, bool vizitat[]){
vizitat[Nod] = true;
for(int vecin : adiacenta[Nod]){
if(!vizitat[vecin]){
DFS(vecin, vizitat);
}
}
}
int graf::NrComponenteConexe(bool vizitat[]){
int NrCompCon = 0;
for(int Nod = 1; Nod <= NrNoduri; Nod++){
if(!vizitat[Nod]){
NrCompCon++;
DFS(Nod, vizitat);
}
}
return NrCompCon;
}
void InfoArena_BFS(){
int N, M, Sursa;
in>>N>>M>>Sursa;
graf G(N, M, true);
G.citireMuchii();
bool vizitat[N + 1] = {false};
int distanta[N + 1] = {0};
G.BFS(Sursa, vizitat, distanta);
}
void InfoArena_DFS(){
int N, M;
in>>N>>M;
graf G(N, M, false);
G.citireMuchii();
bool vizitat[N + 1] = {false};
out<<G.NrComponenteConexe(vizitat);
}
int main()
{
InfoArena_BFS();
//InfoArena_DFS();
return 0;
}