BGL:listS和index_map中的顶点

时间:2017-02-03 11:02:12

标签: c++ boost graph

我是BGL的新手,我已经在墙上撞了几天试图实现顶点去除的图形,直到我发现了一个特别有用的SO问题({{3一个节省了我的一天。

现在我的代码以这种方式构建(下面的简化代码):

struct NodeProperties
{
    int32_t data;
};

typedef property<edge_weight_t, uint32_t> EdgeProperties;

typedef adjacency_list<listS, listS, bidirectionalS,
                       property<vertex_index_t, int, NodeProperties>,
                       EdgeProperties> Graph;

/* In the graph initialization function */
Graph graph;
/* many add_vertex() and add_edge() here */

/* Assign indices */
int i = 0;
BGL_FORALL_VERTICES(v, graph, Graph) {
    get(vertex_index, graph)[v] = i++;
}

/* Make many manipulations, in particular, edge/vertex removal according 
   to certain criteria, NO add_vertex (though some edge are created) */

/* In another function */
vector<int32_t> component(num_vertices(graph));
int num = connected_components(graph, make_iterator_property_map(component.begin(), get(vertex_index, graph), component[0]));

对于我到目前为止所理解的,使用listS作为顶点会阻止使用每个节点的位置作为索引,因此我必须自己使用一种&#34;来提供这个索引。增加财产&#34;。

我很好,但上面的代码工作 - 在connected_components行的分段错误 - 除非我重做索引分配。这样做可以使一切工作完美,但在我创建的心理图片中毫无意义。

可以有人

  • 给我一个很好的参考,解释所有这个index_map&#34; trickery&#34;通俗地说?好吧,有大量的官方文档,但它们看起来方式对我来说太复杂了(我是C程序员)。我打算学习高级C ++,但是我目前必须为我的工作实现这个图形算法,在开始实际代码之前我不能花3个月学习C ++ ...(已经上面的代码工作花了我10个小时的时间) ,我会在那段时间内轻松地在C中重新实现以上所有内容......)
  • 解释我为什么要这样做(或者我在这里做错了什么)?

提前致谢,祝你有愉快的一天!

[R

1 个答案:

答案 0 :(得分:1)

connected_components函数构造一个大小为num_vertices(g)的默认color_map,它在图中小于最大指定顶点索引。当算法尝试为索引大于num_vertices(g)的顶点之一写入颜色时,将访问无效的内存。

当您重新分配所有索引时,它们属于num_vertices(g)。

要快速参考属性,您应该阅读&#34;为图表添加一些颜色&#34;在http://www.boost.org/doc/libs/1_63_0/libs/graph/doc/quick_tour.html