26#ifndef DEPTH_FIRST_SEARCH_INCLUDED
27#define DEPTH_FIRST_SEARCH_INCLUDED
59template <
typename TVertex,
typename TVisit_start,
typename TVisit_end,
60 typename TGet_neighbors,
typename TVertex_less = std::less<TVertex>>
62 TVisit_end visitor_end, TGet_neighbors get_neighbors,
63 std::set<TVertex> &visited_set = std::set<TVertex>{}) {
66 constexpr int START_VISITING = 0;
68 constexpr int CURRENT_VERTEX = 1;
71 std::stack<std::tuple<bool, TVertex>>
stack;
74 if (!visited_set.insert(start_vertex).second) {
77 stack.emplace(
true, start_vertex);
79 while (!
stack.empty()) {
80 std::tuple<bool, TVertex> &elem =
stack.top();
81 if (std::get<START_VISITING>(elem)) {
82 visitor_start(std::get<CURRENT_VERTEX>(elem));
84 std::get<START_VISITING>(elem) =
false;
85 for (TVertex neighbor : get_neighbors(std::get<CURRENT_VERTEX>(elem))) {
87 if (visited_set.insert(neighbor).second) {
88 stack.emplace(
true, neighbor);
92 visitor_end(std::get<CURRENT_VERTEX>(elem));
void depth_first_search(TVertex start_vertex, TVisit_start visitor_start, TVisit_end visitor_end, TGet_neighbors get_neighbors, std::set< TVertex > &visited_set=std::set< TVertex >{})
Performs a Depth First Search algorithm on a graph defined by a set of vertices being an subset of un...
Definition: depth_first_search.h:61
task_env * stack
Definition: task.cc:892