Pagini recente » Cod sursa (job #2670514) | Fisier text | Cod sursa (job #3187119) | Cod sursa (job #974330) | Cod sursa (job #1290952)
#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;
}