我是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行的分段错误 - 除非我重做索引分配。这样做可以使一切工作完美,但在我创建的心理图片中毫无意义。
可以有人
提前致谢,祝你有愉快的一天!
[R
答案 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。