Cod sursa(job #1514385)

Utilizator lefkocdlefkocd lefkocd Data 31 octombrie 2015 09:40:25
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
//Parcurgere in latime
//http://www.infoarena.ro/job_detail/223158?action=view-source
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;

#define maxn 100010

int N, M, L, Start;
vector <int> A[maxn];
int G[maxn], Cost[maxn];
queue<int> Q;

void BFS(int nod)
{
    int i, j;

    memset(Cost, -1, sizeof(Cost));  // Marchez toate nodurile ca fiind nevizitate

    //  Introduc nodul de start in coada
    Cost[nod] = 0;
    Q.push(nod);

    while(!Q.empty()) {//  Elimin pe rand nodurile din coada
        int elementscos=Q.front();
        Q.pop();
        for (j = 0; j < G[elementscos]; j++)    //  Parcurg vecinii nodului ce urmeaza sa fie eliminat
            if (Cost[A[elementscos][j]] == -1)
            {
                //  Adaug vecinii nevizitati in coada si le calculez distanta
                int elementvecin=A[elementscos][j];
                Q.push(elementvecin);
                Cost[elementvecin] = Cost[elementscos] + 1;
            }
    }
}

int main()
{
    freopen("bfs.in", "r", stdin);
    freopen("bfs.out", "w", stdout);

    int i, x, y;

    scanf("%d %d %d ", &N, &M, &Start);

    //  Citesc arcele si retin graful sub forma de lista de vecini

    for (i = 1; i <= M; i++)
    {
        scanf("%d %d ", &x, &y);
        A[x].push_back(y);
    }

    for (i = 1; i <= N; i++)
        G[i] = A[i].size();

    BFS(Start);

    for (i = 1; i <= N; i++)
        printf("%d ", Cost[i]);
    printf("\n");

    return 0;
}