Cod sursa(job #1571369)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 18 ianuarie 2016 00:05:51
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>

using namespace std;

#define MAX_N   100010

vector<int> A[MAX_N]; // Liste de adiacenta

int COST[MAX_N]; // Vectorul de costuri
int C[MAX_N]; // Coada
bool V[MAX_N]; // Vectorul pt elementele vizitate

void BFS(int nod) {
    int p = 1,
        u = 1,
        elemCurent,
        elemVecin;

    C[1] = nod;
    V[nod] = 1;
    COST[nod] = 0;

    while (p <= u) { // Cat timp avem elemente in coada
        elemCurent = C[p];
        for (vector<int>::iterator i = A[elemCurent].begin(); i != A[elemCurent].end(); ++i) { // Parcurgem toti vecinii el. curent
            elemVecin = *i;
            if (V[elemVecin] == 0) { // Daca nu a fost vizitat
                C[++u] = elemVecin;
                V[elemVecin] = 1;
                COST[elemVecin] = 1 + COST[elemCurent]; // Calculam costul sau
            }
        }
        ++p;
    }
}

int n, m, s;

void file_in() {
    int x, y;
    if (freopen("bfs.in", "rt", stdin));
    if (scanf("%d %d %d", &n, &m, &s));
    for (int i=1; i<=m; ++i) {
        if (scanf("%d %d", &x, &y));
        A[x].push_back(y);
    }

    for (int i=1; i<=n; ++i)
        sort(A[i].begin(), A[i].end());

    fclose(stdin);
}


void file_out() {
    if (freopen("bfs.out", "wt", stdout));
    for (int i=1; i<=n; ++i)
        printf ("%d ", ((V[i] > 0) ? (COST[i]) : (-1)));
    fclose(stdout);
}

int main() {
    file_in();
    BFS(s);
    file_out();
    return 0;
}