Cod sursa(job #650922)

Utilizator FIIGLMFIIGherasimLupascuMiron FIIGLM Data 19 decembrie 2011 11:37:02
Problema BFS - Parcurgere in latime Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.61 kb
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
        int info;
        struct node *next;
        } node;
node *L[100];

typedef struct coada { node *prim; node *ultim;} coada;
coada codita;

void PushC(int x)
{
  node *p;
   if(!(p=(node*)calloc(1,sizeof(node)))) 
     {printf("eroare memorie");
     return ;}
   p->info=x;
   p->next=NULL;
   if(codita.ultim==NULL) 
      {codita.prim=p; 
       codita.ultim=p;}
   else
       {codita.ultim->next=p;
        codita.ultim=p;}

}

void PopC()
{
if(codita.prim==NULL) 
{printf("eroare-coada vida\n");
return;}
node *p;
p=codita.prim;
codita.prim=codita.prim->next;
free(p);
}
long long cost[100];
 int main(){
    node *p,*q;
    long long i,j,N,M,k,S,x,viz[100];
    node *c;
    c=(node*)calloc(1,sizeof(node));
    /*FILE* fin,*fout;
    fin=fopen("bfs.in","r");/
    fout=fopen("bfs.out","w");
    fscanf(fin,"%lld %lld %lld",&N,&M,&S);
    */
    scanf("%lld%lld%lld",&N,&M,&S);
    for(k=1;k<=M;k++)
    { //fscanf(fin,"%lld %lld",&i,&j);
    scanf("%lld%lld",&i,&j);
    p=(node*)calloc(1,sizeof(node));  //se adauga j in lista vecinilor lui i 
    p->info=j;
    p->next=L[i];
    L[i]=p;
    }
//   fclose(fin);
    
    codita.prim=codita.ultim=NULL;
    PushC(S);
    
    for(i=1;i<=N;i++) viz[i]=-1;
    
      viz[S]=1;
      while(codita.prim!=codita.ultim)
      {                       c=L[codita.prim->info];
                              
                                while(c!=codita.ultim)
                              {  
                                 if(viz[c->info]==-1) 
                                 {
                                     viz[c->info]=1;
                                     cost[c->info]=cost[codita.prim->info]+1;
                                     PushC(c->info);
                                  }
                                  c=c->next;
                                  
                              }
                              c=codita.prim->next;
                              PopC();
                              codita.prim=c;
                              

                              
      }
      /*
      for(i=1;i<=N;i++)
                       printf("Nodul %d costul %lld viz %lld",i,cost[i],viz[i]);*/
      
      for(i=1;i<=N;i++) 
      { 
        if(viz[i]!=-1) 
             printf("%lld ",cost[i]);          //fprintf(fout,"pentru nodul %lld nr minim de arce este %lld ",i,cost[i]);
        else
            printf(" -1 ");        /* fprintf(fout,"-1");*/
      }
  
  
  system("PAUSE");	
  return 0;
}