Pagini recente » Cod sursa (job #2166510) | Cod sursa (job #1071961) | Cod sursa (job #794596) | Cod sursa (job #530214) | Cod sursa (job #1445690)
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <vector>
#include <list>
#include <queue>
using namespace std;
#define _submit
#ifdef _submit
#define InFile "bfs.in"
#define OutFile "bfs.out"
#else
#define InFile "fis.in"
#define OutFile "fis.out"
#endif
class graph {
private:
vector< list<int> > adiac;
graph();
public:
const list<int>& getList(int);
graph(int);
void addEdge(int, int);
vector<int> BFS(int);
int size();
};
graph::graph(int nrnod) {
adiac.resize(nrnod);
}
const list<int>& graph::getList(int nod) {
return adiac[nod];
}
void graph::addEdge(int n1, int n2) {
adiac[n1].push_back(n2);
}
int graph::size() {
return adiac.size();
}
vector<int> graph::BFS(int startNod) {
vector<char> visited(size(), 0);
vector<int> levels(size(), -1);
queue<int> Q;
Q.push(startNod);
levels[startNod] = 0;
while (!Q.empty()) {
int curNod = Q.front();
Q.pop();
if (visited[curNod])
continue;
visited[curNod] = 1;
const list<int>& vecini = getList(curNod);
for (auto i = vecini.begin(); i != vecini.end(); ++i)
if (!visited[*i]) {
levels[*i] = levels[curNod] + 1;
Q.push(*i);
}
}
return levels;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OutFile, "w", stdout));
int N, M, S;
scanf("%d%d%d", &N, &M, &S);
graph *G = new graph(N);
for (int i = 0; i < M; i++) {
int n1, n2;
scanf("%d%d", &n1, &n2);
G->addEdge(n1-1, n2-1);
}
vector<int> dist = G->BFS(S-1);
for (auto i = dist.begin(); i != dist.end(); ++i)
printf("%d ", *i);
return 0;
}