小编Emm*_*Jay的帖子

Dijkstra图表与每个边缘上的重量表

我有一个增强图,每个边都有多个权重(想象一天中每小时一组权重).这些权重值中的每一个都存储在propretyEdge类中:

class propretyEdge {
    std::map<std::string,double> weights; // Date indexed 
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含这些属性的图形,然后用正确的值填充它.现在的问题是我想在图上的特定权重集上启动Dijkstra算法:例如,一个函数可能是:

void Dijkstra (string date, parameters ... )
Run Code Online (Sandbox Code Playgroud)

那将使用

weights[date]
Run Code Online (Sandbox Code Playgroud)

图的每个边的值.

我一遍又一遍地阅读文档,我无法清楚地知道自己要做什么.我当然需要写这样的东西,但我不知道要开始:

boost::dijkstra_shortest_paths (
    (*graph_m), 
    vertex_origin_num_l,
    // weight_map (get (edge_weight, (*graph_m)))
    // predecessor_map(boost::make_iterator_property_map(predecessors.begin(), get(boost::vertex_index, (*graph_m)))).
    // distance_map(boost::make_iterator_property_map(distances.begin (), get(vertex_index,(*graph_m) )))
    predecessor_map(predecessorMap).
    distance_map(distanceMap)
);
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

编辑

感谢Sehe精彩的回答,我能够在MacOS和Ubuntu上做到我想要的.

但是当我们尝试在Visual Studio 2012上编译这段代码时,似乎VS并不是很擅长理解boost的指针功能.所以我们修改了Sehe的部分:

auto dated_weight_f = [&](Graph::edge_descriptor ed) {
    return g[ed].weights.at(date);
};

auto dated_weight_map = make_function_property_map<Graph::edge_descriptor, double>(dated_weight_f);
Run Code Online (Sandbox Code Playgroud)

通过:

class dated_weight_f {
public:
  dated_weight_f(Graph* graph_p,std::string date_p){
    graph_m=graph_p;
    date_m=date_p;
  }
  typedef double …
Run Code Online (Sandbox Code Playgroud)

c++ boost dijkstra boost-graph boost-property-map

7
推荐指数
1
解决办法
890
查看次数

使Boost Dijkstra算法在到达目标节点时停止

我正在使用boost :: graph及其Dijkstra实现.

当有人使用Dijkstra算法时,可能知道图中2个节点之间的最短路径.但是,当您需要检查图中的所有节点以找到最短路径时,通常(如增强算法)Dijkstra会返回一个原点与图形的所有其他节点之间的所有距离.

当您只想要2个节点之间的路径时,该算法的一个简单改进是在算法到达目标节点时停止它.然后,您确定您对此最终目标节点的距离是最短的.

如何告诉boost Dijkstra算法在到达特定节点时停止?

dijkstra boost-graph c++11

5
推荐指数
2
解决办法
1478
查看次数

标签 统计

boost-graph ×2

dijkstra ×2

boost ×1

boost-property-map ×1

c++ ×1

c++11 ×1