2 #ifndef ANDRES_GRAPH_BFS_HXX
3 #define ANDRES_GRAPH_BFS_HXX
12 #include "subgraph.hxx"
17 template<
typename S = std::
size_t>
27 template<
typename GRAPH>
32 { depth_[v] =
depth; queue_.push(v); }
34 { queue_ = std::queue<size_type>(); }
36 {
return queue_.empty(); }
38 { std::fill(depth_.begin(), depth_.end(),
NOT_VISITED); }
40 {
const size_type v = queue_.front(); queue_.pop();
return v; }
47 std::vector<size_type> depth_;
48 std::queue<size_type> queue_;
51 const S BreadthFirstSearchData<S>::NOT_VISITED = std::numeric_limits<S>::max();
53 template<
typename GRAPH,
typename CALLBACK>
57 const std::size_t start_vertex,
65 template<typename GRAPH, typename CALLBACK, typename = typename std::enable_if<!std::is_lvalue_reference<CALLBACK>::value>::type>
69 const std::size_t start_vertex,
77 template<
typename GRAPH,
typename CALLBACK>
81 const std::size_t start_vertex,
89 template<typename GRAPH, typename CALLBACK, typename = typename std::enable_if<!std::is_lvalue_reference<CALLBACK>::value>::type>
93 const std::size_t start_vertex,
101 template<
typename GRAPH,
typename SUBGRAPH,
typename CALLBACK>
105 const SUBGRAPH& subgraph_mask,
106 const std::size_t start_vertex,
114 template<typename GRAPH, typename SUBGRAPH, typename CALLBACK, typename = typename std::enable_if<!std::is_lvalue_reference<CALLBACK>::value>::type>
118 const SUBGRAPH& subgraph_mask,
119 const std::size_t start_vertex,
127 template<
typename GRAPH,
typename SUBGRAPH,
typename CALLBACK>
131 const SUBGRAPH& subgraph_mask,
132 const std::size_t start_vertex,
137 assert(start_vertex < g.numberOfVertices());
142 callback(start_vertex, 0, proceed, add);
147 data.
add(start_vertex, 0);
150 while(!data.
empty()) {
151 const auto v = data.
next();
152 const auto depth = data.
depth(v) + 1;
154 auto e_it = g.edgesFromVertexBegin(v);
155 for(
auto it = g.verticesFromVertexBegin(v); it != g.verticesFromVertexEnd(v); ++it, ++e_it)
157 subgraph_mask.vertex(*it) &&
158 subgraph_mask.edge(*e_it))
163 callback(*it, depth, proceed, add);
172 data.
add(*it, depth);
177 template<typename GRAPH, typename SUBGRAPH, typename CALLBACK, typename = typename std::enable_if<!std::is_lvalue_reference<CALLBACK>::value>::type>
181 const SUBGRAPH& subgraph_mask,
182 const std::size_t start_vertex,