Pagini recente » Cod sursa (job #2640264) | Cod sursa (job #1311958) | Cod sursa (job #1192121) | Cod sursa (job #3143741) | Cod sursa (job #2780738)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("bfs.in");
ofstream fout("bfs.out");
class graf
{
int n;
int m;
const static int nmaxim=100001;
vector<int> muchii[nmaxim]; //liste de adiacenta
int dist[nmaxim];
int viz[nmaxim];
public:
void BFS(int start);
void DFS(int start);
void citire_orientat();
void citire_neorientat();
void reseteaza_viz();
void reseteaza_dist();
int comp_conexe();
void afiseaza_distante();
graf(int noduri, int muchii):n(noduri), m(muchii) {}
};
void graf::afiseaza_distante()
{
for(int i=1; i<=n; ++i)
fout<<dist[i]<<" ";
}
int graf::comp_conexe()
{
reseteaza_viz();
int nr_comp=0;
for(int i=1;i<=n;++i)
if(!viz[i])
{DFS(i); nr_comp++;}
return nr_comp;
}
void graf::reseteaza_dist()
{
for(int i=1; i<=n; ++i)
dist[i]=-1;
}
void graf::reseteaza_viz()
{
for(int i=1; i<=n; ++i)
viz[i]=0;
}
void graf::DFS(int curent)
{
viz[curent]=1;
for(int i=0; i<muchii[curent].size(); ++i)
if(!viz[muchii[curent][i]])
DFS(muchii[curent][i]);
}
void graf::BFS(int start)
{
queue<int> coada;
reseteaza_dist();
reseteaza_viz();
viz[start]=1;
dist[start]=0;
coada.push(start);
while(!coada.empty())
{
int vf=coada.front();
coada.pop();
for(int i=0; i<muchii[vf].size(); ++i)
if(!viz[muchii[vf][i]])
{
viz[muchii[vf][i]]=1;
dist[muchii[vf][i]]=dist[vf]+1;
coada.push(muchii[vf][i]);
}
}
}
void graf::citire_orientat()
{
int n1,n2;
for(int i=0; i<m; ++i)
{
fin>>n1>>n2;
muchii[n1].push_back(n2);
}
}
void graf::citire_neorientat()
{
int n1,n2;
for(int i=0; i<m; ++i)
{
fin>>n1>>n2;
muchii[n1].push_back(n2);
muchii[n2].push_back(n1);
}
}
int main()
{
int n,m,s;
fin>>n>>m>>s;
graf g(n,m);
g.citire_orientat();
g.BFS(s);
g.afiseaza_distante();
return 0;
}