gpt4 book ai didi

c++ - boost::dijkstra_shortest_paths 覆盖内部图权重?

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:32 24 4
gpt4 key购买 nike

我正在使用 Boost 图库来存储具有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com