我正在使用Boost Graph库来存储带有double
边缘权重和double
顶点权重的无向图。在代码的多个位置,我需要应用Dijkstra的算法来搜索最短路径。直到我决定我想用我自己的权重临时覆盖存储的边缘权重(这只是暂时的,图形权重不会被修改)之前,这一直很好。我的代码基本上如下所示:
// 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引用,但是图形的边缘权重将在之后更改。我究竟做错了什么?或更具体地说,如何临时覆盖加权图中的边缘权重?显然,我可以简单地存储当前的边缘权重,将其替换为权重,然后再将其更改回去。但是,我确信是的错,并且我不想忽略此问题。
最佳答案
我曾经遇到过同样的问题-我想临时(针对搜索算法的特定运行)修改边缘权重,而又不永久更改图形本身。经过一番搜索,我发现了这一点,它使您可以注册用于生成权重的函子。这用作weight_map参数:
http://www.boost.org/doc/libs/1_51_0/boost/property_map/function_property_map.hpp
关于c++ - boost::dijkstra_shortest_paths是否覆盖内部图形权重?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12383313/