#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/breadth_first_search.hpp>
#include <boost/graph/visitors.hpp>
using Graph = boost::adjacency_list<>;
using Vertex = Graph::vertex_descriptor;
using Edge = Graph::edge_descriptor;
namespace boost
{
template <typename event_type>
class test_visitor: public default_bfs_visitor
{
public:
using event_filter = event_type;
void discover_vertex(Vertex, const Graph&) const
{
std::cout << "vertex discovered" << std::endl;
}
};
}
int main()
{
// Initialize a test graph
Graph graph;
Vertex vertexFoo = boost::add_vertex(graph);
Vertex vertexBar = boost::add_vertex(graph);
Vertex vertexBaz = boost::add_vertex(graph);
boost::add_edge(vertexFoo, vertexBar, graph);
boost::add_edge(vertexBar, vertexBaz, graph);
// Initialize parents map
std::vector<Vertex> parents_map(boost::num_vertices(graph));
parents_map[vertexFoo] = vertexFoo;
// Perform BFS with two listeners
boost::breadth_first_search(
graph,
vertexFoo,
boost::visitor(
boost::make_bfs_visitor(
std::make_pair(
boost::record_predecessors(&parents_map[0], boost::on_tree_edge()),
boost::test_visitor<boost::on_discover_vertex()>()
)
)
)
);
return 0;
}
I2luY2x1ZGUgPGJvb3N0L2dyYXBoL2FkamFjZW5jeV9saXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2JyZWFkdGhfZmlyc3Rfc2VhcmNoLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2dyYXBoL3Zpc2l0b3JzLmhwcD4KCnVzaW5nIEdyYXBoID0gYm9vc3Q6OmFkamFjZW5jeV9saXN0PD47CnVzaW5nIFZlcnRleCA9IEdyYXBoOjp2ZXJ0ZXhfZGVzY3JpcHRvcjsKdXNpbmcgRWRnZSA9IEdyYXBoOjplZGdlX2Rlc2NyaXB0b3I7CgpuYW1lc3BhY2UgYm9vc3QgCnsKCXRlbXBsYXRlIDx0eXBlbmFtZSBldmVudF90eXBlPgogICAgY2xhc3MgdGVzdF92aXNpdG9yOiBwdWJsaWMgZGVmYXVsdF9iZnNfdmlzaXRvciAKICAgIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgCXVzaW5nIGV2ZW50X2ZpbHRlciA9IGV2ZW50X3R5cGU7CiAgICAgICAgICAgIHZvaWQgZGlzY292ZXJfdmVydGV4KFZlcnRleCwgY29uc3QgR3JhcGgmKSBjb25zdCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJ2ZXJ0ZXggZGlzY292ZXJlZCIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICB9CiAgICB9Owp9CgppbnQgbWFpbigpIAp7CgkKCS8vIEluaXRpYWxpemUgYSB0ZXN0IGdyYXBoCglHcmFwaCBncmFwaDsKCVZlcnRleCB2ZXJ0ZXhGb28gPSBib29zdDo6YWRkX3ZlcnRleChncmFwaCk7CglWZXJ0ZXggdmVydGV4QmFyID0gYm9vc3Q6OmFkZF92ZXJ0ZXgoZ3JhcGgpOwoJVmVydGV4IHZlcnRleEJheiA9IGJvb3N0OjphZGRfdmVydGV4KGdyYXBoKTsKCWJvb3N0OjphZGRfZWRnZSh2ZXJ0ZXhGb28sIHZlcnRleEJhciwgZ3JhcGgpOwoJYm9vc3Q6OmFkZF9lZGdlKHZlcnRleEJhciwgdmVydGV4QmF6LCBncmFwaCk7CgkKCS8vIEluaXRpYWxpemUgcGFyZW50cyBtYXAKCXN0ZDo6dmVjdG9yPFZlcnRleD4gcGFyZW50c19tYXAoYm9vc3Q6Om51bV92ZXJ0aWNlcyhncmFwaCkpOwoJcGFyZW50c19tYXBbdmVydGV4Rm9vXSA9IHZlcnRleEZvbzsKCQoJLy8gUGVyZm9ybSBCRlMgd2l0aCB0d28gbGlzdGVuZXJzCglib29zdDo6YnJlYWR0aF9maXJzdF9zZWFyY2goCgkJZ3JhcGgsCgkJdmVydGV4Rm9vLAoJCWJvb3N0Ojp2aXNpdG9yKAoJCQlib29zdDo6bWFrZV9iZnNfdmlzaXRvcigKCQkJCXN0ZDo6bWFrZV9wYWlyKAoJCQkJCWJvb3N0OjpyZWNvcmRfcHJlZGVjZXNzb3JzKCZwYXJlbnRzX21hcFswXSwgYm9vc3Q6Om9uX3RyZWVfZWRnZSgpKSwKCQkJCQlib29zdDo6dGVzdF92aXNpdG9yPGJvb3N0Ojpvbl9kaXNjb3Zlcl92ZXJ0ZXgoKT4oKQoJCQkJKQoJCQkpCgkJKQoJKTsKCQoJcmV0dXJuIDA7Cn0=