Cod sursa(job #1016525)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 26 octombrie 2013 13:51:10
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#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();
}