Cod sursa(job #972986)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 13 iulie 2013 00:14:36
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <algorithm>
#include <queue>

#define x first
#define y second
#define mp make_pair

FILE *f=fopen("bfs.in","r");
FILE *g=fopen("bfs.out","w");

using namespace std;

queue <int> q;
pair <int,int> vrtx[1000001];

struct nod{
    int v;
    nod *next;
};
typedef nod *lista;

char used[100001];
int n,m,S,cost[100001];
lista lv[100001];

void get_GRAPH()
{
    int i,a,b;
    lista p;
    fscanf(f,"%d%d%d",&n,&m,&S);
    for(i=1;i<=m;++i)
        {
         fscanf(f,"%d%d",&a,&b);
         vrtx[i]=mp(a,b);
        }
    sort(vrtx+1,vrtx+m+1);
    for(i=1;i<=m;++i)
    if((vrtx[i-1].x!=vrtx[i].x||vrtx[i-1].y!=vrtx[i].y)&&vrtx[i].x!=vrtx[i].y)
        {p=new nod;p->v=vrtx[i].y;p->next=lv[vrtx[i].x];lv[vrtx[i].x]=p;}
}

void BFS()
{
    lista p;
    q.push(S);used[S]=1;
    while(!q.empty())
    {
        for(p=lv[q.front()];p;p=p->next)
        if(!used[p->v])
        {
            used[p->v]=1;
            cost[p->v]=cost[q.front()]+1;
            q.push(p->v);
        }
        q.pop();
    }
}

void PRINT()
{
    int i;
    for(i=1;i<=n;++i)
        if(cost[i]||i==S)fprintf(g,"%d ",cost[i]);
        else fprintf(g,"-1 ");
}

int main()
{
    get_GRAPH();
    BFS();
    PRINT();
    return 0;
}