2017-02-03 4 views
0

私はBGLを初めて使っています。頂点を削除してグラフを実装しようと数日間壁に頭を突きつけていました。 this 1)私の一日を救った。BGL:listSとindex_mapの頂点

が今私のコードは、この方法(以下簡略化されたコード)で構成されています

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])); 

私がこれまで理解した内容については、頂点のリストの使用は、各ノードの位置を使用してからブーストを防ぎしたがって、私は一種の「追加されたプロパティ」を使ってこのインデックス付けを自分自身に提供しなければなりません。

私はそれで罰金ですが、上記のコードは、ない作業を行います - 私は、インデックスの割り当てをやり直すない限り- connected_componentsラインでセグメンテーションフォールトになります。そうすることで、すべてが完璧に動作しますが、私が作成した精神的なイメージには意味がありません。

は、誰か

  • は私の素人的にすべてこのindex_map「策略」を説明する良いの参照を与えてもらえますか? [OK]を、公式のドキュメントのトンがありますが、彼らは方法私にはあまりにも複雑な(私はCのプログラマーです)見える。私は高度なC++を学ぶことを計画していますが、私は現在、私の仕事のためにこのグラフアルゴリズムを実装しなければなりません。実際のコードを始める前にC++を学ぶのに3ヶ月かかることはありません...その時間内に上記のすべてをC言語で簡単に再実装していたでしょう...)
  • なぜ私はこれをやっているのですか?

ありがとうございました。素敵な日です!

R

答えて

1

connected_components関数は、グラフであなたの最大割り当てられた頂点のインデックスよりも小さいサイズnum_vertices(g)でデフォルトのcolor_mapを構築します。アルゴリズムがnum_vertices(g)より大きなインデックスを持つ頂点の1つの色を書き込もうとすると、無効なメモリがアクセスされます。

すべてのインデックスを再割り当てすると、num_vertices(g)に収まります。

プロパティのクイックリファレンスについては、http://www.boost.org/doc/libs/1_63_0/libs/graph/doc/quick_tour.htmlの「グラフに色を追加する」を参照してください。

関連する問題