Cod sursa(job #1337154)

Utilizator afkidStancioiu Nicu Razvan afkid Data 8 februarie 2015 17:30:24
Problema BFS - Parcurgere in latime Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <iostream>
#include <list>
#include <map>
#include <vector>
#include <utility>
#include <deque>

using namespace std;

map<int,list<int> > arcs;
vector<int> colors;
vector<int> distances;

int read()
{
    int n=0;
    char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')
    {
        n=(n<<1)+(n<<3)+c-'0';
        c=getchar();
    }
    return n;
}

void bfs(int s,int n)
{
    deque<int> fifo;
    list<int>::iterator it;
    map<int,list<int> >::iterator itM;
    fifo.push_back(s);
    colors.at(s)=1;
    while(!fifo.empty())
    {
        int p=fifo.front();
        itM=arcs.find(p);
        it=(itM->second).begin();
        while(it!=(itM->second).end())
        {
            if(colors.at(*it)==0)
            {
                fifo.push_back(*it);
                colors.at(*it)=1;
                distances.at(*it)=distances.at(p)+1;
            }
            it++;
        }
        colors.at(p)=2;
        fifo.pop_front();
    }
}

int main()
{
    freopen("bfs.in","r",stdin);
    freopen("bfs.out","w",stdout);
    map<int, list<int> >::iterator it;
    int n,m,s,a,b;
    n=read();
    m=read();
    s=read();
    for(int i=0; i<=n; ++i)
    {
        distances.push_back(-1);
        colors.push_back(0);
    }
    for(int i=1; i<=m; ++i)
    {
        a=read();
        b=read();
        it=arcs.find(a);
        if(it!=arcs.end())
        {
            it->second.push_back(b);
        }
        else
        {
            list<int> listA;
            listA.push_back(b);
            arcs.insert(make_pair(a,listA));
        }
    }
    bfs(s,n);
    for(int i=1; i<=n; ++i)
    {
        if(distances.at(i)==-1 && s!=i)
        {
            printf("%d ",distances.at(i));
        }
        else
        {
            printf("%d ",distances.at(i)+1);
        }
    }
    printf("\n");
    return 0;
}