Алгоритм deep_first_search BGL иногда вызывает back_edge () для посетителей, даже если на графике нет циклов. По определению заднего края и согласно Документации для посетителей DFS Boost этого не должно быть. Обратите внимание, что это воспроизводимо только тогда, когда listS используется в качестве представления для вершин и ребер.
Пример кода ниже (должен компилироваться как есть) строит граф с двумя узлами и одним ребром. Он неправильно печатает «задний край». Я что-то здесь не так делаю? Или это ошибка?
#include <iostream>
using namespace std;
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/visitors.hpp>
using namespace boost;
typedef boost::property<boost::vertex_index_t,std::size_t> VertexProperties;
typedef boost::adjacency_list<boost::listS,
boost::listS,
boost::bidirectionalS,
VertexProperties> Graph; // Graph object type
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
typedef boost::graph_traits<Graph>::edge_descriptor Edge;
class VisitorClass : public dfs_visitor<> {
public:
VisitorClass() {}
template <typename Edge, typename Graph>
void back_edge(Edge, const Graph&) const {
cout << "back edge" << endl;
}
};
int
main() {
Graph g;
Vertex v = add_vertex(g);
Vertex u = add_vertex(g);
bool inserted;
tie(tuples::ignore, inserted) = add_edge(v, u, g);
assert(inserted);
VisitorClass vst;
depth_first_search(g, visitor(vst));
// Should not print "back edge", but does.
return 0;
}
Протестировано с Boost 1.46.1 с использованием i686-apple-darwin11-llvm-g ++ - 4.2 на Mac OS 10.7;
Протестировано с Boost 1.42.0 с использованием gcc 4.4.5 в Debian 2.6.32-34squeeze1.