Pagini recente » Cod sursa (job #2001026) | Cod sursa (job #2912692) | Photo | simulare_oji_2023_clasa_10_17_martie | Cod sursa (job #1984789)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxNumberOfNodes 400100
int numberOfNodes;
int numberOfEdges;
int sourceNode;
int index;
int node1;
int node2;
int queue[ maxNumberOfNodes ];
bool isVisited[ maxNumberOfNodes ];
int D[maxNumberOfNodes];
int left = 1;
int right = 1;
int headQueue;
struct Nodes
{
int data;
struct Nodes *next;
};
struct Nodes *addiacencyList[ maxNumberOfNodes ];
struct Nodes *listIterator;
void add_to_list_forward(int node1, int node2)
{
struct Nodes *head = malloc(sizeof(struct Nodes));
head -> data = node2;
head -> next = addiacencyList[node1];
addiacencyList[node1] = head;
/*struct Nodes *head2 = malloc(sizeof(struct Nodes));
head2 -> data = node1;
head2 -> next = addiacencyList[node2];
addiacencyList[node2] = head2;*/
}
int main()
{
//freopen("bfs.in", "r", stdin);
//freopen("bfs.out", "w", stdout);
FILE *fin = fopen("bfs.in", "r");
FILE *fout = fopen("bfs.out", "w");
//scanf("%d %d %d", &numberOfNodes, &numberOfEdges, &sourceNode);
fscanf(fin, "%d %d %d", &numberOfNodes, &numberOfEdges, &sourceNode);
for(index = 1; index <= numberOfEdges; index ++)
{
fscanf(fin, "%d %d", &node1, &node2);
add_to_list_forward(node1, node2);
}
queue[left] = sourceNode;
isVisited[ sourceNode ] = true;
D[ sourceNode ] = 0;
while(left <= right)
{
headQueue = queue[left];
for(listIterator = addiacencyList[ headQueue ]; listIterator != NULL; listIterator = listIterator -> next)
{
if( isVisited[ listIterator -> data ] == false)
{
isVisited[ listIterator -> data ] = true;
right = right + 1;
queue[right] = listIterator -> data;
D[ listIterator -> data] = D[ headQueue ] + 1;
}
}
left = left + 1;
}
for(index = 1; index <= numberOfNodes; index ++)
{
if(isVisited[index] == true)
{
fprintf(fout, "%d ", D[index]);
}
else
{
fprintf(fout, "-1 ");
}
}
// fclose(stdin);
//fclose(stdout);
return 0;
}