Cod sursa(job #1021291)

Utilizator Alina_MariaMateescu Adina Lenuta Maria Alina_Maria Data 3 noiembrie 2013 16:48:09
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#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;
}