Pagini recente » Cod sursa (job #1573170) | Cod sursa (job #129352) | Cod sursa (job #2241851) | Cod sursa (job #157555) | Cod sursa (job #1016525)
#include <cstdio>
#include <vector>
#include <queue>//am scris corect?da
#define N 100001
using namespace std;
vector<int> a[N]; // listsa de adiacenta
int d[N], u[N], n, m, s;
void read(){
freopen("bfs.in", "r", stdin);
scanf("%d %d %d ", &n, &m, &s);
for(int i = 1; i <= m; ++i) {
int p, q;
scanf("%d %d", &p, &q);
a[p].push_back(q);
}
}
void solve(){
queue<int> Q;//e ok?da
//declara sus vectorii de distanta si used
// baga in coada pe s
Q.push(s);//paraca asa nu?da, acum seteaza d si used pt s
d[s] = 0;
u[s] = 1;
// cat timp mai ai elemente in coada
while(!Q.empty()){//asa?nu//atunci cum?pai ce inseamnea empty?asa?:D da
// scoate primul nod din coada nu il memorez intai?ba da
int x = Q.front();//cu sau fara steluta?fara
Q.pop();//pop elimina doar primul, deci nu are parametru
// acum parcurgi vecinii lui x
//nu prea stiu cum sa percurc in <vector>
// ai 2 metode: cu iterator sau ca la vector normal
for (int i = 0; i < a[x].size(); ++i)
if(!u[a[x][i]]){
u[a[x][i]] = 1;
d[a[x][i]] = d[x] + 1;
Q.push(a[x][i]);
}//altceva?
// bun, dar astea le faci doar daca nu e vizitat vecinul
}
for(int i = 1; i <= n; ++i){
if(u[i])
printf("%d ", d[i]);
else
printf("-1 ");//cam asta ar fi nu?da
// hai sa-ti arat cum as scrie eu cu un singur printf
// printf ("%d ", u[i] ? d[i] : -1);
// conditie ? rezultat_on_true : rezultat_on_false
}
printf ("\n");
}
int main(){
freopen("bfs.out", "w", stdout);
read();
solve();
}