Cod sursa(job #2199446)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 27 aprilie 2018 19:12:00
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
// Copyright (C) 2018 Gheoace Mihai - All Rights Reserved

#include<cstdio>
#include<bitset>
#include<cstdlib>
#include <cstring>
using namespace std;
bitset < 100001 > viz;
#define N 100002

typedef struct nod{
    int a;
    nod* urm;
} *Pnod;
Pnod v[100001];
void Push(Pnod &dest,int val)
{
    Pnod p;
    p = new nod;
    p->a = val;
    p->urm = dest;
    dest = p;
}
void dfs(int i)
{
    Pnod p;
    viz[i] = 1;
    for (p = v[i]; p != NULL; p = p->urm)
        if (!viz[p->a])
            dfs(p->a);
}

int S[N];  // stiva de noduri care  vor fi vizitate.
int Cost[N];  // distanta intre nodul x(de unde incepe bfs).
// si nodul i
void BFS(int rad){
    int l=1;
    // setam toate nodurile nevizitate.
    memset(Cost, -1, sizeof(int) * N);
    S[l] = rad;  // introduc nodul de start in coada.
    Cost[rad]=0;
    int i,j;
    for (i = 1; i <= l; ++i)  // parcurg nodurile din coada si se scot.
         for (Pnod p = v[S[i]]; p != NULL; p = p->urm)
            if( Cost[p->a] == -1){
                S[++l] = p->a;  // adaug nodul in coada.
                Cost[p->a]=Cost[S[i]]+1;  // salvez distanta nodul curent si tatal sau.
            }
}
int main(){
    int n, m;
    int x, y, i, s;
    FILE *f = freopen("bfs.in", "r", stdin),
    *g = freopen("bfs.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &s);
    for(i=0;i<m;++i){  // citeste arcele sub forma unei liste de vecini.
        scanf("%d %d",&x,&y);
        Push(v[x],y);
        // Push(v[y],x);.
    }
    BFS(s);
    for(i=1;i<=n;++i)
        printf("%d ",Cost[i]);
    printf("\n");
}