adjacency_listのグラフをコピーする際に注意することがあります。
VertexListにlistSなど指定しているとvertex_descriptorはコピー先で使用できないということです。vecSの場合vertex_descriptorは整数インデックスなので問題ないと思いますが他はポインタのようなものなので使用できません。当たり前の話ですが少し嵌ってしまいました。
そこでコピー元に対応するコピー先のvertex_descriptorをどうやって取得したらいいのかということですが、
copy_graph関数をorig_to_copyパラメータと共に使用します。
これで全ての頂点に対してコピー元とコピー先のvertex_descriptorペアが取得できます。
#include <map> #include <iostream> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/copy.hpp> #include <boost/property_map.hpp> using namespace boost; int main() { typedef adjacency_list<listS, listS, directedS> Graph; typedef Graph::vertex_descriptor Vertex; Graph g(5), h; typedef std::map<Vertex, Vertex> Map; //結果を格納するコンテナ unordered_mapなどでもよい。 Map m; associative_property_map<Map> pm(m); //associative_property_mapでラップする copy_graph(g, h, orig_to_copy(pm)); //グラフをコピーしながら、orig_to_copyで全ての対応するvertex_descriptorペアを取得 for (Map::iterator p = m.begin(); p != m.end(); ++p) { std::cout << p->first << " -> " << p->second << std::endl; } }
0x80f0008 -> 0x80f00e0 0x80f0030 -> 0x80f0128 0x80f0058 -> 0x80f0170 0x80f0080 -> 0x80f01b8 0x80f00a8 -> 0x80f0200