Boost图形库:潜在错误

Boost图形库:潜在错误,boost,graph,visitor,boost-graph,Boost,Graph,Visitor,Boost Graph,BGL的深度优先搜索算法有时会调用访问者的边(),即使图中没有循环。根据后缘的定义,根据Boost的说法,这不应该发生。请注意,仅当列表用作顶点和边的表示时,这才是可复制的 下面的代码示例(应按原样编译)构造了一个包含两个节点和一条边的图。它错误地打印了“后缘”。我在这里做错什么了吗?还是这是一只虫子 #include <iostream> using namespace std; #include <boost/graph/adjacency_list.hpp> #i

BGL的深度优先搜索算法有时会调用访问者的边(),即使图中没有循环。根据后缘的定义,根据Boost的说法,这不应该发生。请注意,仅当列表用作顶点和边的表示时,这才是可复制的

下面的代码示例(应按原样编译)构造了一个包含两个节点和一条边的图。它错误地打印了“后缘”。我在这里做错什么了吗?还是这是一只虫子

#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;
}
#包括
使用名称空间std;
#包括
#包括
#包括
使用名称空间boost;
typedef boost::属性VertexProperties;
typedef boost::邻接列表图;//图形对象类型
typedef boost::graph_traits::vertex_描述符顶点;
typedef boost::graph_traits::edge_描述符edge;
类访问者类:公共dfs\U访问者{
公众:
VisitorClass(){}
模板
void back_边(边、常量图和)常量{

你提交了一个bug,但没有跟进

不久之后,你得到了一个答案:

您没有初始化图形的顶点索引属性。请尝试添加一些代码,例如:

图形特征::顶点大小类型i=0

BGL_用于所有顶点(v,图,图)put(顶点索引,g,v,i++)

我试过这个(修正排版),效果很好:

#include <boost/graph/iteration_macros.hpp>

int main() {
  Graph g;   
  Vertex v = add_vertex(g);   
  Vertex u = add_vertex(g);

  graph_traits<Graph>::vertices_size_type i = 0;  
  BGL_FORALL_VERTICES(v, g, Graph) put(vertex_index, g, v, i++);

  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;
  }
#包括
int main(){
图g;
顶点v=添加顶点(g);
顶点u=添加_顶点(g);
图形特征::顶点大小类型i=0;
所有顶点(v,g,图)的BGL_放置(顶点索引,g,v,i++);
布尔插入;
tie(元组::忽略,插入)=添加_边(v,u,g);
断言(插入);
VisitorClass vst;
深度优先搜索(g,访客(vst));
//不应打印“后边缘”,但应打印。
返回0;
}

(至少,它不再打印“后缘”)

你不应该在boost邮件列表上问这个问题吗?我提交了一份错误报告。我想我也应该在这里问一下,以防我设置图表的方式出现明显错误。我也会向boost的用户邮件列表发送一封电子邮件。错误报告:的确。我应该在错误报告解决后更新这篇文章。