Cod sursa(job #2739580)

Utilizator GligarEsterabadeyan Hadi Gligar Data 8 aprilie 2021 20:18:28
Problema BFS - Parcurgere in latime Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
///bfs cu memorie alocata dinamic
///vector implementat cu mad si coada cu mad

#include <fstream>

using namespace std;

ifstream fin("bfs.in");
ofstream fout("bfs.out");

struct vector{
    int *v=nullptr;
    int capacity=0, size=0;

    void push_back(int x);
};

void vector::push_back(int x){
    if(v==nullptr){
        v=new int[1];
        v[0]=x;
        size++;
        capacity=1;
    }else if(capacity==size){
        capacity*=2;
        int *v2=new int[capacity];
        for(int i=0;i<size;i++){
            v2[i]=v[i];
        }
        delete[] v;
        v=v2;
        v[size]=x;
        size++;
    }else{
        v[size]=x;
        size++;
    }
}

struct queue{
    int *q=new int[1];
    int b=0, capacity=0, size=0;

    void push(int x);
    int front();
    void pop();
    bool empty();
};

void queue::push(int x){
    if(q==nullptr){
        q=new int[1];
        q[0]=x;
        size++;
        capacity=1;
    }else if(capacity==size){
        capacity*=2;
        int *q2=new int[capacity];
        for(int i=b;i<size;i++){
            q2[i]=q[i];
        }
        delete[] q;
        q=q2;
        q[size]=x;
        size++;
    }else{
        q[size]=x;
        size++;
    }
}

int queue::front(){
    return q[b];
}

void queue::pop(){
    b++;
}

bool queue::empty(){
    return b==size;
}

const int nmax=100000;

vector g[nmax+1];

int d[nmax+1];

queue q;

void bfs(int s){
    d[s]=1;
    q.push(s);
    while(q.empty()==0){
        int x=q.front();
        q.pop();
        for(int i=0;i<g[x].size;i++){
            int xn=g[x].v[i];
            if(d[xn]==0){
                q.push(xn);
                d[xn]=d[x]+1;
            }
        }
    }
}

int main(){
    int n,m,s;
    fin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int x,y;
        fin>>x>>y;
        g[x].push_back(y);
        //g[y].push_back(x);
    }
    bfs(s);
    for(int i=1;i<=n;i++){
        if(d[i]==0){
            fout<<"-1 ";
        }else{
            fout<<d[i]-1<<" ";
        }
    }
    fout<<"\n";
    return 0;
}