Pagini recente » Cod sursa (job #2545308) | Cod sursa (job #2506955) | Cod sursa (job #2175903) | Istoria paginii runda/meister/clasament | Cod sursa (job #2432222)
#include <stdio.h>
#include <stdlib.h>
#define VISITED 1
#define UNVISITED 0
typedef struct bfsarrray{
int level;
int node;
}BfsArray;
typedef struct node{
int number_of_neighbours;
int *neighbours;
int *costs;
}AdjacencyList;
void addNeighbour(AdjacencyList **list, int node, int neighbour, int cost)
{
if ((*list)[node].number_of_neighbours == 0)
{
(*list)[node].neighbours = (int *) calloc(1, sizeof(int));
(*list)[node].costs = (int *) calloc(1, sizeof(int));
(*list)[node].number_of_neighbours ++;
(*list)[node].neighbours[(*list)[node].number_of_neighbours - 1] = neighbour;
(*list)[node].costs[(*list)[node].number_of_neighbours - 1] = cost;
}
else
{
(*list)[node].number_of_neighbours ++;
(*list)[node].neighbours = (int *) realloc((*list)[node].neighbours, (*list)[node].number_of_neighbours * sizeof(int));
(*list)[node].costs = (int *) realloc((*list)[node].costs, (*list)[node].number_of_neighbours * sizeof(int));
(*list)[node].neighbours[(*list)[node].number_of_neighbours - 1] = neighbour;
(*list)[node].costs[(*list)[node].number_of_neighbours - 1] = cost;
}
}
void BFS(AdjacencyList *list, int numar_noduri, int nodStart)
{
int *visited = (int *) calloc(numar_noduri + 1, sizeof(int));
int *levels = (int *) calloc(numar_noduri + 1, sizeof(int));
int startNode = nodStart;
BfsArray *bfsarray = (BfsArray*)calloc(numar_noduri, sizeof(BfsArray));
int currentPosition = 0;
int numarNoduri = 0;
bfsarray[0].node = startNode;
bfsarray[0].level = 0;
numarNoduri++;
visited[startNode]=VISITED;
while(currentPosition < numar_noduri)
{
for( int i = 0; i < list[bfsarray[currentPosition].node].number_of_neighbours; i++)
{
if(visited[list[bfsarray[currentPosition].node].neighbours[i]] == UNVISITED)
{
bfsarray[numarNoduri].node = list[bfsarray[currentPosition].node].neighbours[i];
bfsarray[numarNoduri].level = bfsarray[currentPosition].level + 1;
levels[bfsarray[numarNoduri].node] = bfsarray[numarNoduri].level;
visited[list[bfsarray[currentPosition].node].neighbours[i]] = VISITED;
numarNoduri++;
}
}
currentPosition++;
}
FILE *write = fopen("bfs.out","w");
for(int i = 1; i <= numar_noduri; i++)
{
if(levels[i] == 0 && i != startNode)
fprintf(write, "-1 ");
else
fprintf(write, "%d ", levels[i]);
}
}
int main()
{
int numar_noduri, numar_muchii, startNode, x, y;
FILE *read = fopen("bfs.in", "r");
fscanf(read,"%d%d%d", &numar_noduri, &numar_muchii, &startNode);
AdjacencyList * list = (AdjacencyList *) calloc(numar_noduri + 1, sizeof(AdjacencyList));
for(int i = 0; i < numar_muchii; i++)
{
fscanf(read, "%d%d", &x, &y);
addNeighbour(&list, x, y, 0);
}
BFS(list, numar_noduri, startNode);
return 0;
}