Pagini recente » Cod sursa (job #675913) | Cod sursa (job #2307491) | Cod sursa (job #1679662) | Cod sursa (job #1589536) | Cod sursa (job #1021291)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define maxN 100005
using namespace std;
vector<int> arr[maxN];
int n, m, s, x, y, cnt, vizitatAndCost[maxN], Q[maxN], limitQ;
void citireMuchii() {
for(int i = 1; i <= m; ++i) {
scanf("%d %d", &x, &y);
arr[x].push_back(y);
}
}
void afisareMuchii() {
for(int i = 1; i <= n; ++i) {
for(int j = 0; (unsigned)j < arr[i].size(); ++j) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void BFS(int nodStart){
memset(vizitatAndCost, -1, sizeof(vizitatAndCost));
int currElem;
// la inceput initializez limita cozii,
// bag un singur element = nodul de start
// specific faptul ca lungimea drumului e 0 de la start la start
limitQ = 1;
Q[limitQ] = nodStart;
vizitatAndCost[nodStart] = 0;
for(int i = 1; i <= limitQ; ++i) { // parcurg coada
for(int j = 0; (unsigned)j < arr[Q[i]].size(); ++j) { // parcurg lista de adiacenta a ficarui element din coada
currElem = arr[ Q[i] ][j];
if (vizitatAndCost[ currElem ] == -1) { // nu a mai fost vizitat acest vecin (adica nu i s-a mai calc. costul)
// incrementez limita cozii pentru ca sa mai adaug vecinul nevizitat si apoi il adaug
Q[++limitQ] = currElem;
// costul noului vecin care a fost acum adugat este costul nodului adiacent (cel care l-a bagat) + 1
vizitatAndCost[ Q[limitQ] ] = vizitatAndCost[ Q[i] ] + 1;
}
}
}
}
int main() {
freopen("bfs.in", "r", stdin);
freopen("bfs.out", "w", stdout);
scanf("%d %d %d", &n, &m, &s);
//printf("%d %d %d", n, m, s);
citireMuchii();
//printf("\n");
//afisareMuchii();
BFS(s);
for(int i = 1; i <= n; ++i)
printf("%d ", vizitatAndCost[i]);
return 0;
}