2016-05-20 8 views
0

私はBGL初心者です:私は有向グラフを持っていて、エッジにバンドルプロパティを使用しています。 int型を入力します。ユニークなインデックスを知って、私はその上で操作を実行するために、そのエッジの対応するedge_descriptorを取得したいと思います。次の例は、私の問題をまとめたものです。ブーストグラフライブラリ:end_descriptorを取得するか、int型のインデックスでエッジにアクセスする

#include <boost/graph/adjacency_list.hpp> 

struct EdgeProperties { 
    EdgeProperties(): distance(10), time_limit(5) {}; 
    int index; 
    int distance; 
    int time_limit; 
}; 

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperties> Graph; 

int main() { 

    Graph graph; 

    EdgeProperties edge_prop1, edge_prop2, edge_prop3, edge_prop4; 

    // Define edge properties 
    edge_prop1.index = 0; 
    edge_prop2.index = 1; 
    edge_prop3.index = 2; 
    edge_prop4.index = 3; 

    // Add edges to graph 
    boost::add_edge(0, 1, edge_prop1, graph); 
    boost::add_edge(0, 2, edge_prop2, graph); 
    boost::add_edge(1, 3, edge_prop3, graph); 
    boost::add_edge(2, 3, edge_prop4, graph); 

    // Get vertex_descriptor from an (int) index: 
    int vertex_index = 2; 
    boost::graph_traits<Graph>::vertex_descriptor v = boost::vertex(vertex_index, graph); 

    // I would like to get an edge_descriptor from an (int) index property: 
    // The following DOES NOT work: 
    boost::graph_traits<Graph>::edge_descriptor e = boost::edge(edge_prop1.index, graph); 
} 

私はプロパティマップについても読んでいますが、解決策が見つかりませんでした。内部のプロパティよりもbundled propertiesが好きです。 バンドルプロパティを介して一意のint型インデックスをエッジに割り当て、これらのint型の値を使ってエッジにアクセスする方法はありますか?

答えて

2

悲しいことに、boost::graphはすぐに役立つと思います。

エッジプロパティのフィールドに基づいてエッジ(またはその点については頂点)を見つける仕組みはありません.BGLはそのようなマッピングを保持しています。あなたが持っている「インデックス」フィールドは、目的。

第2に、グラフのすべての辺に対してイテレータ範囲を返す関数があります。しかし、vecSをedgeコンテナ型としてadjacency_listテンプレートに渡してからこの範囲内を調べることができますが、http://www.boost.org/doc/libs/1_61_0/libs/graph/doc/EdgeListGraph.htmlごとに、イテレータはマルチパス入力イテレータでなければならず、実装はvecSエッジタイプでは、ランダムアクセスはできません。

したがって、あなたが望むものを達成する唯一の方法は、自分自身をインデックスからエッジの記述子に保つことです。

関連する問題