double
Boost Graph Library を使用して、辺の重みとdouble
頂点の重みを含む無向グラフを保存しています。私のコードのいくつかの場所で、最短経路を検索するためにダイクストラのアルゴリズムを適用する必要があります。これは、保存されているエッジの重みを自分の重みで一時的にオーバーライドすることを決定するまでは非常にうまく機能します (一時的にのみ、グラフの重みは変更されません)。私のコードは基本的に次のようになります。
// Initial typedefs
typedef boost::property<boost::edge_weight_t, double> edge_weight_t;
typedef boost::property<boost::vertex_discover_time_t, double> vertex_weight_t;
typedef boost::adjacency_list<boost::vecS,
boost::vecS,
boost::undirectedS,
vertex_weight_t,
edge_weight_t> graph_t;
// In a function, where graph is a const reference of type graph_t
std::vector<double> pathLengths( boost::num_vertices( graph ) );
boost::property_map<graph_t, boost::edge_weight_t>::type weightMap;
boost::graph_traits<graph_t>::edge_iterator e_it, e_it_end;
for( boost::tie( e_it, e_it_end ) = boost::edges( graph );
e_it != e_it_end;
++e_it )
{
weightMap[ *e_it ] = 1.0;
}
boost::dijkstra_shortest_paths( graph,
boost::vertex( vertex, graph ),
boost::distance_map( &pathLengths[0] ).weight_map( weightMap ) );
上記のコードでgraph
はconst 参照ですが、グラフのエッジの重みは後で変更されます。私は何を間違っていますか?より具体的には、重み付きグラフのエッジの重みを一時的にオーバーライドするにはどうすればよいですか?
もちろん、現在のエッジ ウェイトを単純に保存し、自分のウェイトに置き換えて、後で元に戻すこともできます。しかし、私は自分に問題があると確信しており、この問題を無視したくありません。