/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* bfs.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/27 14:41:49 by tmaze #+# #+# */ /* Updated: 2019/04/05 13:24:22 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "lem_in.h" 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; char used; it = data->adj[tab[i].queue]; used = 0; while (it != NULL) { if (tab[it->index].visited == 0 && it->weight == 2) used = 1; if (tab[it->index].visited == 0 && it->weight == 2) break ; it = it->next; } it = data->adj[tab[i].queue]; while (it != NULL) { if (tab[it->index].visited == 0 && ((!used && it->weight > 0) || (used && it->weight == 2))) bfs_addtoqueue(tab, it->index, data->nb_nodes); if (tab[it->index].visited == 0 && ((!used && it->weight > 0) || (used && it->weight == 2))) 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++); }