首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::dijkstra_shortest_paths覆盖内部图权重?

boost::dijkstra_shortest_paths覆盖内部图权重?
EN

Stack Overflow用户
提问于 2012-09-12 07:39:13
回答 1查看 973关注 0票数 2

我使用Boost图形库来存储一个无向图,其中包含double边权值和double顶点权重。在我的代码中的几个地方,我需要应用Dijkstra的算法来搜索最短路径。在我决定用自己的权重临时覆盖存储的边权值之前,这是非常有效的(只是暂时的,图形权重不应该被修改)。我的代码基本上如下所示:

代码语言:javascript
复制
  // 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引用,但是图的边权值在后面会被改变。我做错了什么?或者更具体地说,我如何在加权图中临时覆盖边缘权重?

显然,我可以简单地存储当前的边缘权重,用我的权重替换它们,然后再将它们更改回来。但是,我确信I是错误的,我不想忽视这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-24 05:24:15

我相信,我也有同样的问题--我想暂时(为了特定的搜索算法运行)修改边缘权重,而不是永久地改变图形本身。经过一些搜索,我发现了这个,它允许您注册一个函子,用于生成权重。它用作weight_map参数:

map.hpp

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12383313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档