Cod sursa(job #525976)

Utilizator icepowdahTudor Didilescu icepowdah Data 26 ianuarie 2011 21:49:44
Problema BFS - Parcurgere in latime Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <queue>
using namespace std;

struct list_node {
  int id;
  list_node* next;
};

struct vertex {
  int id;
  bool visited;
  int dist;
  list_node* neighbors;
};

void readInput();
void releaseData();

int N, M, S;
vertex* adj_list;

int main(void)
{
  queue<int> dfs_queue;

  freopen("bfs.in","r",stdin);
  freopen("bfs.out","w",stdout);
  readInput();

  adj_list[S].dist = 0;
  adj_list[S].visited = true;
  dfs_queue.push(S);
  while (!dfs_queue.empty())
  {
    int u = dfs_queue.front();
    dfs_queue.pop();
    
    list_node* it = adj_list[u].neighbors;
    while (it != NULL)
    {
      if (!adj_list[it->id].visited)
      {
        adj_list[it->id].dist = adj_list[u].dist+1;
        adj_list[it->id].visited = true;
        dfs_queue.push(it->id);
      }
      it = it->next;
    }
  }

  for (int i=1;i<=N;i++)
  {
    printf("%d ",adj_list[i].dist);
  }
  printf("\n");
 
  releaseData();
  return 0;
}

void readInput()
{
  int i, from, to;

  scanf("%d %d %d",&N,&M,&S);

  adj_list = new vertex [N+1];
  for (i=1;i<=N;i++)
  {
    adj_list[i].id = i;
    adj_list[i].visited = false;
    adj_list[i].neighbors = NULL;
    adj_list[i].dist = -1;
  }

  for (i=0;i<M;i++)
  {
    scanf("%d %d",&from,&to);
    list_node* nod = new list_node;
    nod->id = to;
    nod->next = adj_list[from].neighbors;
    adj_list[from].neighbors = nod;
  }
}

void releaseData()
{
  for (int i=1;i<=N;i++)
  {
    while (adj_list[i].neighbors != NULL)
    {
      list_node *tmp = adj_list[i].neighbors;
      adj_list[i].neighbors = tmp->next;
      delete tmp;
    }
  }
  delete[] adj_list;
}