Cod sursa(job #260158)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 16 februarie 2009 18:35:01
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define M 1000002
#define N 100002
long muc[M], urm[M], pnt[N],dist[N];int viz[N];
typedef struct nod
{long n;
 nod* urm;
}*pnod;
pnod beg,end;

void adauga_nod(long var)
{if(beg==NULL)
 {beg=(nod*) malloc(sizeof(nod));
  end=beg; 
  (*beg).n=var;
  (*beg).urm=NULL;
 }
 else
 {pnod p=(nod*) malloc(sizeof(nod));
  (*p).n=var;
  (*end).urm=p;
  (*p).urm=NULL;
  end=p;
 }
}

void sterge_nod()
{pnod p=beg;
 if(p)
  {beg=(*beg).urm;
   free(p);
  }
}


int main ()
{FILE *fin=fopen("bfs.in","r");
 FILE *fout=fopen("bfs.out","w");
 long n,m,s,i,x,y,vf;
 fscanf(fin,"%ld%ld%ld",&n,&m,&s);
 for (vf=1,i=0;i<m;i++)
 {fscanf(fin,"%ld%ld",&x,&y);
  muc[vf]=y;
  urm[vf]=pnt[x];
  pnt[x]=vf;
  vf++;
 }
 for(i=1;i<=n;i++)
 {dist[i]=-1;
 }
 memset(viz,0,sizeof(viz));
 adauga_nod(s);
 dist[s]=0;
 viz[s]=1;
 while(beg!=NULL)
 {x=(*beg).n;
  sterge_nod();
  for (i=pnt[x];i;i=urm[i])
  {if(viz[muc[i]]==0)
   {viz[muc[i]]=1;
    dist[muc[i]]=dist[x]+1;
    adauga_nod(muc[i]);
   }
  }  
 }
 for (i=1;i<=n;i++)
 {fprintf(fout,"%ld ",dist[i]);
 }
 fclose(fout);
 return 0;
}