Cod sursa(job #1500073)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 11 octombrie 2015 14:58:05
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
/*Cerinta
Fiind dat un nod S, sa se determine, pentru fiecare nod X, numarul minim de arce ce
 trebuie parcurse pentru a ajunge din nodul sursa S la nodul X.

Date de intrare
Fisierul de intrare bfs.in contine pe prima linie 3 numere intregi N M S, cu semnificatia
 din enunt. Urmatoarele M linii contin cate doua numere x y, cu semnificatia ca exista arc orientat de la x la y.

Date de iesire
In fisierul de iesire bfs.out se vor afla N numere separate prin spatiu cu semnificatia ca al
i-lea numar reprezinta numarul minim de arce ce trebuie parcurse de la nodul S la nodul i.

Restrictii
2 ≤ N ≤ 100 000
1 ≤ M ≤ 1 000 000
Daca nu se poate ajunge din nodul S la nodul i, atunci numarul corespunzator numarului i va fi -1.*/
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>

using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");

const int NMax=100005;

int n,m,y;
vector <int> G[NMax];
int d[NMax];
queue <int> Q;

void citire()
{
    f>>n>>m>>y;
    for(int i=0;i<m;i++)
    {
        int a,b;
        f>>a>>b;
        G[a].push_back(b);
    }
}

void BFS()
{
    memset(d,-1,sizeof(d));
    Q.push(y);
    d[y]=0;
    while(!Q.empty())
    {
        int nod=Q.front(); Q.pop();
        for(int i=0;i<(int)G[nod].size();i++)
        {
            int val=G[nod][i];
            if(d[val]==-1) d[val]=d[nod]+1   ,   Q.push(val);
        }
    }
}

int main()
{
    citire();
    BFS();
    for(int i=1;i<=n;i++)
    {
        g<<d[i]<<' ';
    }
    g<<'\n';
    return 0;
}