Pagini recente » Cod sursa (job #62456) | Istoria paginii runda/autumn20/clasament | Cod sursa (job #161851) | Rezultatele filtrării | Cod sursa (job #2780168)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
class Graf {
int n;
int m;
vector<int> v[100002];
bool viz[100002];
public:
Graf(int n, int m, pair<int, int> muchii[]);
int nrComponenteConexe();
vector<int> bfs(int srs);
private:
void dfs(int nod);
};
Graf :: Graf(int n, int m, pair<int, int> muchii[]) {
this->n = n;
this->m = m;
for (int i = 1; i <= m; i++) {
v[ muchii[i].first ].push_back(muchii[i].second);
}
}
int Graf :: nrComponenteConexe() {
for (int i = 1; i <= n; i++) {
viz[i] = false;
}
int nr = 0;
for (int i = 1; i <= n; i++) {
if (!viz[i]) {
nr++;
dfs(i);
}
}
return nr;
}
void Graf :: dfs(int nod) {
viz[nod] = true;
for (int i = 0; i < v[nod].size(); i++) {
if (!viz[ v[nod][i] ]) {
dfs(v[nod][i]);
}
}
}
vector<int> Graf :: bfs(int srs) {
vector<int> dist;
dist.resize(n + 1);
for (int i = 1; i <= n; i++) {
dist[i] = -1;
}
queue<int> q;
q.push(srs);
dist[srs] = 0;
while (!q.empty()) {
int nod = q.front();
for (int i = 0; i < v[nod].size(); i++) {
int vecin = v[nod][i];
if (dist[vecin] == -1) {
dist[vecin] = dist[nod] + 1;
q.push(vecin);
}
}
q.pop();
}
return dist;
}
int n, m, i, srs;
pair<int, int> muchii[1000005];
ifstream fin ("bfs.in");
ofstream fout("bfs.out");
int main() {
fin>> n >> m >> srs;
for (i = 1; i <= m; i++) {
fin>> muchii[i].first >> muchii[i].second;
}
Graf* graf = new Graf(n, m, muchii);
vector<int> dist = graf->bfs(srs);
for (int i = 1; i <= n; i++) {
fout<< dist[i] <<" ";
}
}