Cod sursa(job #1290952)

Utilizator ArkinyStoica Alex Arkiny Data 11 decembrie 2014 23:20:29
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<fstream>
#define MAX 100001
struct Node
{
	int data;
	Node *next;
};

Node *A[MAX];
int queue[MAX],sq=-1,eq=-1,viz[MAX],cost[MAX];

int N,M,S;

void add_to_list(int index,int data)
{
	Node *q=new Node;
	q->data=data;
	q->next=A[index];
	A[index]=q;
}

void remove_first_elem(int index)
{
	if(A[index])
	{
		Node *p=A[index];
		A[index]=A[index]->next;
		delete p;
	}
}

int inline  get_first_elem(int index)
{
	if(A[index])
	 return A[index]->data;

	return -1;
}

void add_to_queue(int data)
{
	if(sq==(-1) && eq==(-1))
		sq=eq=1,queue[eq]=data;
	else
	{
		int t=(eq+1)%(MAX-1);
		if(t==0)
			t=1;
		queue[t]=data;
		eq=t;
	}
}
int isEmpty()
{
	if(sq==(-1) && eq==(-1))
		return 1;
	else
		return 0;
}
void pop_queue()
{
	int t=(sq+1)%(MAX-1);
	if(t==0)
		t=1;
	sq=t;
	if(sq>eq)
		sq=eq=-1;
}

int inline queue_front()
{
	return queue[sq];
}

std::ifstream in("bfs.in");
std::ofstream out("bfs.out");

void BFS(int s)
{
	add_to_queue(s);
	while(!isEmpty())
	{
		int node=queue_front();
		viz[node]=1;
		int ok;
		do
		{
			ok=get_first_elem(node);
			if(ok!=-1)
			{
			    if(!viz[ok])
				{
					viz[ok]=1;
					add_to_queue(ok);
					if(ok!=s)
					  cost[ok]=cost[node]+1;
				}
				remove_first_elem(node);
			}
		}while(ok!=-1);
		pop_queue();
	}
}


int main()
{
	in>>N>>M>>S;

	for(int i=1,j,k;i<=M;i++)
	{
		in>>j>>k;
		add_to_list(j,k);
	}
	BFS(S);
	for(int i=1;i<=N;i++)
	{
		if(viz[i])
		  out<<cost[i]<<" ";
		else
		  out<<-1<<" ";
	}


	return 0;
}