6

ブーストbreadth_first_visit方式を使用したいのですが、独自の「外部」カラーマップを提供したいと思います。グラフを次のように定義しました

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, 
  boost::property<boost::vertex_index_t, int, 
  boost::property<boost::vertex_color_t, boost::default_color_type, 
  Node_t>>>  GraphType;

ここNode_tで、は構造体であり、頂点のプロパティを定義します。ただし、BFSに独自のカラーマップを提供する方法がわかりません。頂点の色をベクトルに保存したいので、私の定義は次のようになります。

std::vector<boost::default_color_type> colors;

しかし、私はそれを理解することができません、bfsのためにこれを使用する方法。

ない

boost::breadth_first_search(g, *boost::vertices(g).first, 
  boost::color_map(colors));

または

boost::breadth_first_search(g, *boost::vertices(g).first, 
  boost::color_map(&colors[0]));

仕事中。最初のコンパイルではさまざまなコンパイラエラーが発生しますが(たとえば、default-intはサポートされていませんが、クラスタイプの「boost :: color_traits」の使用にはタイプ引数リストが必要です)、2番目のコンパイルはC2664のみで中止されます:'boost :: put'パラメータ2を「void*」から「ptrdiff_t」に変換します。

だから問題は、どうすれば自分のカラーマッピング構造を使用できるかということです。追加の質問は次のようになります:特定のvertex_descriptorの色値を取得するにはどうすればよいですか?

4

1 に答える 1

4

わかりました、別のアプローチを使用しましたが、問題を解決しました。ブーストのカラーマップについて私と同じくらい混乱している人、または興味のある人のために:

bfs が使用するカラーマップの Type は次のとおりです。

typedef boost::property_map<GraphType, boost::vertex_color_t>::type color_map_t;
color_map_t colorMap; //Create a color map

vertex_descriptorこれは(私の場合) にマップされdefault_color_typeます。ブーストの bfs への適切な呼び出しは次のようになります。

boost::breadth_first_visit(g, *boost::vertices(g).first, boost::color_map(colorMap));

次のような色番号をマップする color_names 構造が与えられた場合

const char* color_names[] = {"white", "gray", "green", "red", "black"};

グラフ内のすべての頂点を反復処理し、現在の頂点の vertex_descriptor をカラー マップの [] 演算子の引数として使用することで、色を反復処理できます。

GraphType::vertex_iterator it, itEnd;
for (boost::tie(it, itEnd) = boost::vertices(g); it != itEnd; it++)
{
  std::cout << "Color of node " << *it << " is " << color_names[colorMap[*it]] << std::endl;
}
于 2012-07-26T11:00:23.380 に答える