Cod sursa(job #3156138)

Utilizator BadHero112Ursu Vasile BadHero112 Data 10 octombrie 2023 17:33:22
Problema BFS - Parcurgere in latime Scor 20
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#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 ");
}