Pagini recente » Cod sursa (job #1465368) | Cod sursa (job #1271589) | Cod sursa (job #320636) | Cod sursa (job #1658588) | Cod sursa (job #3156138)
#include <stdlib.h>
#include <stdio.h>
//queue implementation~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
typedef struct cell{
int data;
struct cell* next;
}cell;
typedef struct queue{
cell* front;
cell* back;
}queue ;
void queue_init(queue* Q){
Q->front=NULL;
Q->back=NULL;
}
void queue_insert(int val,queue* Q){
cell* next = (cell*)malloc(sizeof(cell));
if(Q->front==NULL){
Q->back=next;
Q->front=Q->back;
Q->back->data=val;
Q->back->next=NULL;
}
else{
Q->back->next=next;
Q->back=next;
Q->back->data=val;
Q->back->next=NULL;
}
}
void queue_pop(queue* Q){
cell* next=Q->front->next;
if(Q->back==Q->front)Q->back=next;
free(Q->front);
Q->front=next;
}
int queue_front(queue* Q){
if(Q->front==NULL)abort();
return Q->front->data;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int main(){
freopen("bfs.in","r",stdin);
freopen("bfs.out","w",stdout);
int n,m,start;
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&start);
start--;
queue A[100001];
for(int i=0;i<n;i++){
queue_init(&A[i]);
}
for(int i=0;i<m;i++){
int a,b;
scanf("%d",&a);
scanf("%d",&b);
queue_insert(b-1,&A[a-1]);
}
/*for(int i=0;i<n;i++){
while(A[i].front!=NULL){
printf("%d ",A[i].front->data);
queue_pop(&A[i]);
}
printf("\n");
}*/
queue Q;
queue_init(&Q);
int *depth,*vis;
depth=(int*)malloc(100001*sizeof(int));
vis=(int*)malloc(100001*sizeof(int));
for(int i=0;i<n;i++){
depth[i]=0;
vis[i]=0;
}
queue_insert(start,&Q);
while(Q.front!=NULL){
int i=Q.front->data;
queue_pop(&Q);
if(vis[i])continue;
vis[i]=1;
while(A[i].front!=NULL){
int j=A[i].front->data;
if(!vis[j]){
depth[j]=depth[i]+1;
queue_insert(j,&Q);
}
queue_pop(&A[i]);
}
}
for(int i=0;i<n;i++)if(i==start||depth[i])printf("%d ",depth[i]);
else printf("-1 ");
}