functionning edmunds_karp still need some testing for already used nodes still need some memory protection
84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* bfs.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2019/03/27 14:41:49 by tmaze #+# #+# */
|
|
/* Updated: 2019/03/31 18:23:21 by tmaze ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "lem_in.h"
|
|
|
|
static void bfs_print(t_bfs *tab, int nb_nodes)
|
|
{
|
|
int i;
|
|
|
|
i = 0;
|
|
ft_printf("===== bfs print =====\n");
|
|
while (i < nb_nodes)
|
|
{
|
|
ft_printf("index: %d\nparent: %d\nvisited: %d\nqueue: %d\n\n", i
|
|
, tab[i].parent, tab[i].visited != 0, tab[i].queue);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
static void bfs_addtoqueue(t_bfs *tab, int node, int nb_nodes)
|
|
{
|
|
int i;
|
|
|
|
i = 0;
|
|
if (tab[node].visited == 0)
|
|
{
|
|
while (i < nb_nodes && tab[i].queue != -1 && tab[i].queue != node)
|
|
i++;
|
|
if (i < nb_nodes && tab[i].queue == -1)
|
|
tab[i].queue = node;
|
|
}
|
|
}
|
|
|
|
static void bfs_checkadj(t_lmdata *data, t_bfs *tab, int i)
|
|
{
|
|
t_ind *it;
|
|
|
|
it = data->adj[tab[i].queue];
|
|
while (it != NULL)
|
|
{
|
|
if (tab[it->index].visited == 0 && it->weight > 0)
|
|
bfs_addtoqueue(tab, it->index, data->nb_nodes);
|
|
if (tab[it->index].visited == 0 && it->weight > 0)
|
|
tab[it->index].parent = tab[i].queue;
|
|
it = it->next;
|
|
}
|
|
}
|
|
|
|
static void bfs_init(t_bfs *tab, t_lmdata *data)
|
|
{
|
|
int i;
|
|
|
|
i = 0;
|
|
while (i < data->nb_nodes)
|
|
{
|
|
tab[i].parent = -1;
|
|
tab[i].visited = 0;
|
|
tab[i].queue = -1;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void bfs(t_lmdata *data, t_bfs *tab, int start_ind, int end_ind)
|
|
{
|
|
int i;
|
|
|
|
bfs_init(tab, data);
|
|
bfs_addtoqueue(tab, start_ind, data->nb_nodes);
|
|
i = 0;
|
|
while (i < data->nb_nodes && tab[i].queue != -1
|
|
&& tab[end_ind].parent == -1 && (tab[tab[i].queue].visited = 1))
|
|
bfs_checkadj(data, tab, i++);
|
|
bfs_print(tab, data->nb_nodes);
|
|
}
|