我刚刚有了一个脑电波。你说你试过了
void tree_edge(Edge e, Graph& g) { ...
如果图形是 const,这当然不会起作用(就像在 BGL 中实现 dfs 的情况一样。
使它成为常量引用!
Live On Coliru
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
using namespace boost;
struct MyVertex {};
struct MyEdge {};
using Graph = adjacency_list<vecS, vecS, directedS, MyVertex, MyEdge>;
struct my_visitor : default_dfs_visitor {
template <class Vertex, class Graph>
void initialize_vertex(Vertex u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Vertex, class Graph>
void start_vertex(Vertex u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Vertex, class Graph>
void discover_vertex(Vertex u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Edge, class Graph>
void examine_edge(Edge u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Edge, class Graph>
void tree_edge(Edge u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Edge, class Graph>
void back_edge(Edge u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Edge, class Graph>
void forward_or_cross_edge(Edge u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Edge, class Graph>
void finish_edge(Edge u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
template <class Vertex, class Graph>
void finish_vertex(Vertex u, const Graph& g) {
std::cout << __FUNCTION__ << "(" << u << ", g)\n";
(void) g;
}
};
#include <random>
#include <boost/graph/random.hpp>
int main() {
Graph g;
std::mt19937 prng {42};
generate_random_graph(g, 10, 20, prng);
my_visitor vis;
std::vector<default_color_type> colormap(num_vertices(g));
depth_first_search(g, vis, make_iterator_property_map(colormap.begin(), get(vertex_index, g)));
}
打印
initialize_vertex(0, g)
initialize_vertex(1, g)
initialize_vertex(2, g)
initialize_vertex(3, g)
initialize_vertex(4, g)
initialize_vertex(5, g)
initialize_vertex(6, g)
initialize_vertex(7, g)
initialize_vertex(8, g)
initialize_vertex(9, g)
start_vertex(0, g)
discover_vertex(0, g)
examine_edge((0,4), g)
tree_edge((0,4), g)
discover_vertex(4, g)
examine_edge((4,1), g)
tree_edge((4,1), g)
discover_vertex(1, g)
finish_vertex(1, g)
finish_vertex(4, g)
examine_edge((0,9), g)
tree_edge((0,9), g)
discover_vertex(9, g)
examine_edge((9,1), g)
forward_or_cross_edge((9,1), g)
examine_edge((9,2), g)
tree_edge((9,2), g)
discover_vertex(2, g)
finish_vertex(2, g)
examine_edge((9,1), g)
forward_or_cross_edge((9,1), g)
finish_vertex(9, g)
examine_edge((0,1), g)
forward_or_cross_edge((0,1), g)
examine_edge((0,4), g)
forward_or_cross_edge((0,4), g)
examine_edge((0,2), g)
forward_or_cross_edge((0,2), g)
finish_vertex(0, g)
start_vertex(3, g)
discover_vertex(3, g)
examine_edge((3,7), g)
tree_edge((3,7), g)
discover_vertex(7, g)
examine_edge((7,5), g)
tree_edge((7,5), g)
discover_vertex(5, g)
examine_edge((5,1), g)
forward_or_cross_edge((5,1), g)
examine_edge((5,6), g)
tree_edge((5,6), g)
discover_vertex(6, g)
examine_edge((6,1), g)
forward_or_cross_edge((6,1), g)
examine_edge((6,3), g)
back_edge((6,3), g)
examine_edge((6,5), g)
back_edge((6,5), g)
finish_vertex(6, g)
finish_vertex(5, g)
examine_edge((7,6), g)
forward_or_cross_edge((7,6), g)
examine_edge((7,8), g)
tree_edge((7,8), g)
discover_vertex(8, g)
examine_edge((8,3), g)
back_edge((8,3), g)
finish_vertex(8, g)
finish_vertex(7, g)
examine_edge((3,1), g)
forward_or_cross_edge((3,1), g)
finish_vertex(3, g)