Cod sursa(job #257380)

Utilizator alecmanAchim Ioan Alexandru alecman Data 13 februarie 2009 09:59:14
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<string.h>

#define INPUT "bfs.in"
#define OUTPUT "bfs.out"
#define NMAX 100001

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

struct Graph
{
  long val;
  Graph *next;
};

long N, M, S;
long Valid[ NMAX ], Deq[ NMAX ], Cont[ NMAX ];
Graph *List[ NMAX ];

void readData()
{
  long Node1, Node2;
  Graph *adr;

  fscanf(fin, "%ld %ld %ld", &N, &M, &S);

  for(long i = 0; i < M; ++i)
  {
    fscanf(fin, "%ld %ld", &Node1, &Node2);

    adr = new Graph;
    adr -> val = Node2;
    adr -> next = List[ Node1 ];
    List[ Node1 ] = adr;
  }
}

void solve()
{
  memset(Valid, 0, sizeof(Valid));
  memset(Deq, 0, sizeof(Deq));

  Valid[ S ] = -1;
  Deq[ 0 ] = S;
  Cont[ 0 ] = 0;
  long pStart = 0, pFin = 0;
  long nCont = 0;

  Graph *adr;

  while(Deq[ pStart ] != 0)
  {
    adr = List[ Deq[ pStart ] ];
    nCont = Cont[ pStart ] + 1;
    
    while(adr != NULL)
    {
      if(Valid[ adr -> val ] == 0)
      {
        ++pFin;
        Deq[ pFin ] = adr -> val;
        Valid[ adr -> val ] = nCont;
        Cont[ pFin ] = nCont;
      }
      adr = adr -> next;
    }
    
    ++pStart;
  }

  for(long i = 1; i <= N; ++i)
  {
    if(Valid[ i ] == 0)
      Valid[ i ] = -1;
    else
    if(Valid[ i ] == -1)
      Valid[ i ] = 0;
  }

  for(long i = 1; i <= N; ++i)
    fprintf(fout, "%ld ", Valid[ i ]);
}

int main()
{
  readData();

  solve();

  fclose(fin);
  fclose(fout);

  return 0;
}