inline connected_components_t<Entity> connected_components(const std::vector<Entity>& entities, FNeigh&& get_neighbors, FCompPred&& in_component, FPred&& valid_start) { std::set<Entity> todo(entities.begin(), entities.end()), visited; connected_components_t<Entity> components; while (visited.size() < todo.size()) { // find first unvisited entity Entity start = *std::find_if(todo.begin(), todo.end(), [&] (Entity entity) { return visited.find(entity) == visited.end(); }); if (!valid_start(start)) { visited.insert(start); continue; } connected_component_t<Entity> component; traverse( start, std::forward<FNeigh>(get_neighbors), [&] (Entity entity) { return in_component(entity, start); }, [&] (Entity entity) { component.push_back(entity); visited.insert(entity); }, false ); components.push_back(component); } return components; }
void resolve(t_list *list, int ant) { int value; t_list *l; l = list; value = 1; init_dist(list); valid_start(list); ((t_salle*)list->content)->dist = 0; give_value((t_salle*)list->content); while (l != NULL) { if (((t_salle *)l->content)->name[0] == 'L') ft_error(); l = l->next; } if (ant <= 0) ft_error(); omg(list, value, ant); }