Pagini recente » Cod sursa (job #355107) | Cod sursa (job #1154120) | Cod sursa (job #1392255) | Cod sursa (job #2667882) | Cod sursa (job #2432220)
#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;
//calloc, realloc, malloc
//callocul este malloc cu initializare de 0 in plus
// int *a = malloc int *a = calloc 0 0 0 0 0 0
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 DFS(AdjacencyList *list, int *visited, int currentNode)
{
visited[currentNode] = VISITED;
printf("%d \n", currentNode);
for( int i = 0; i < list[currentNode].number_of_neighbours; i++)
{
if(visited[list[currentNode].neighbours[i]] == UNVISITED)
{
DFS(list, visited, list[currentNode].neighbours[i]);
}
}
}
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]);
}
free(bfsarray);
free(visited);
}
void destroyAdjacencyList(AdjacencyList **list, int number_of_nodes)
{
for(int i = 0; i <= number_of_nodes; i++)
{
if ((*list)[i].number_of_neighbours > 0)
{
free((*list)[i].neighbours);
free((*list)[i].costs);
}
}
free(*list);
}
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);
destroyAdjacencyList(&list, numar_noduri);
return 0;
}