简体   繁体   English

具有VertexList的Dijkstra最短路径=增强图中的ListS

[英]Dijkstra Shortest Path with VertexList = ListS in boost graph

I am quite new to Boost graph. 我对Boost图表很新。 I am trying to adapt an example for finding Dijkstra Shortest Path algorithm which used VertexList = vecS. 我正在尝试调整一个例子来找到使用VertexList = vecS的Dijkstra最短路径算法。 I changed the vertex container to ListS. 我将顶点容器更改为ListS。 I learned that we have to provide our own vertex_index for the algorithm to work if we use listS. 我了解到,如果我们使用listS,我们必须提供自己的vertex_index才能使算法正常工作。

int main(int, char *[])
{
  typedef float Weight;
  typedef boost::property<boost::edge_weight_t, Weight> WeightProperty;
  typedef boost::property<boost::vertex_name_t, std::string> NameProperty;
  typedef boost::property<boost::vertex_index_t, int> IndexProperty;

  typedef boost::adjacency_list < boost::listS, boost::listS, boost::directedS,
  NameProperty, WeightProperty > Graph;

  typedef boost::graph_traits < Graph >::vertex_descriptor Vertex;
  typedef boost::graph_traits <Graph>::vertex_iterator Viter;

  typedef boost::property_map < Graph, boost::vertex_index_t >::type IndexMap;
  typedef boost::property_map < Graph, boost::vertex_name_t >::type NameMap;

  typedef boost::iterator_property_map < Vertex*, IndexMap, Vertex, Vertex& > PredecessorMap;
  typedef boost::iterator_property_map < Weight*, IndexMap, Weight, Weight& > DistanceMap;

  Graph g;


  Vertex v0 = boost::add_vertex(std::string("v0"), g);
  Vertex v1 = boost::add_vertex(std::string("v1"), g);
  Vertex v2 = boost::add_vertex(std::string("v2"), g);
  Vertex v3 = boost::add_vertex(std::string("v3"), g);

  Weight weight0 = 5;
  Weight weight1 = 3;
  Weight weight2 = 2;
  Weight weight3 = 4;

  boost::add_edge(v0, v1, weight0, g);
  boost::add_edge(v1, v3, weight1, g);
  boost::add_edge(v0, v2, weight2, g);
  boost::add_edge(v2, v3, weight3, g);


  std::vector<Vertex> predecessors(boost::num_vertices(g)); // To store parents
  std::vector<Weight> distances(boost::num_vertices(g)); // To store distances

  IndexMap indexMap; // = boost::get(boost::vertex_index, g);
  NameMap name;
  Viter i, iend;
 //Create our own vertex index. This is what I changed in the original code
    int c = 0;
  for (boost::tie(i, iend) = vertices(g); i != iend; ++i, ++c) {
       indexMap[*i] = c; // **Error points to this line**
       name[*i] = 'A' + c;
  }
PredecessorMap predecessorMap(&predecessors[0], indexMap);
DistanceMap distanceMap(&distances[0], indexMap);
boost::dijkstra_shortest_paths(g, v0,   boost::distance_map(distanceMap).predecessor_map(predecessorMap));


  // Extract a shortest path
  std::cout << std::endl;
  typedef std::vector<Graph::edge_descriptor> PathType;
  PathType path;
  Vertex v = v3; 
  for(Vertex u = predecessorMap[v]; 
  u != v; // Keep tracking the path until we get to the source
  v = u, u = predecessorMap[v]) // Set the current vertex to the current predecessor,     and the predecessor to one level up
  {
     std::pair<Graph::edge_descriptor, bool> edgePair = boost::edge(u, v, g);
    Graph::edge_descriptor edge = edgePair.first;
    path.push_back( edge );
  }

  // Write shortest path
  std::cout << "Shortest path from v0 to v3:" << std::endl;
  float totalDistance = 0;
  for(PathType::reverse_iterator pathIterator = path.rbegin(); pathIterator !=       path.rend(); ++pathIterator)
  {
    std::cout << name[boost::source(*pathIterator, g)] << " -> " <<     name[boost::target(*pathIterator, g)]
              << " = " << boost::get( boost::edge_weight, g, *pathIterator ) <<     std::endl;

  }

  std::cout << std::endl;

  std::cout << "Distance: " << distanceMap[v3] << std::endl;

  return EXIT_SUCCESS;
}

I get the following error: 我收到以下错误:

/spvec.cpp:62:20: error: no match for 'operator=' in 'index.boost::adj_list_vertex_property_map::operator[] [with Graph = boost::adjacency_list >, boost::property >, ValueType = boost::detail::error_property_not_found, Reference = boost::detail::error_property_not_found&, Tag = boost::vertex_index_t, boost::adj_list_vertex_property_map::key_type = void*](i.std::_List_iterator<_Tp>::operator* with _Tp = void*, _Tp& = void*&) = c' /spvec.cpp:62:20:错误:'index.boost :: adj_list_vertex_property_map :: operator []中没有匹配'operator ='[与Graph = boost :: adjacency_list>,boost :: property>,ValueType = boost :: detail :: error_property_not_found,Reference = boost :: detail :: error_property_not_found&,Tag = boost :: vertex_index_t,boost :: adj_list_vertex_property_map :: key_type = void *](i.std :: _ List_iterator <_Tp> :: operator * with _Tp = void *,_ Tp&= void *&)= c'

I am sure I made a mistake in creating my own vertex index. 我确信我在创建自己的顶点索引时犯了一个错误。 But couldn´t find out exactly what´s the issue. 但无法确切地找出问题所在。 Does anyone have some suggestions on what I am doing wrong.. 有没有人对我做错了什么有一些建议..

BGL actually has an example of using dijkstra_shortest_paths with listS/listS, but it's not linked to from the HTML documentation: http://www.boost.org/doc/libs/release/libs/graph/example/dijkstra-example-listS.cpp BGL实际上有一个使用dijkstra_shortest_paths和listS / listS的例子,但它没有链接到HTML文档: http//www.boost.org/doc/libs/release/libs/graph/example/dijkstra-example-listS的.cpp

What the error message is trying to tell you ( error: no match for 'operator=' in 'index.boost:: adj_list_vertex_property_map ...ValueType = boost::detail:: error_property_not_found ... ) is that there is no per-vertex storage for the vertex_index_t property, which is what adj_list_vertex_property_map needs. 错误消息试图告诉你的内容( error: no match for 'operator=' in 'index.boost:: adj_list_vertex_property_map ...ValueType = boost::detail:: error_property_not_found ... )是没有 - vertex_index_t属性的顶点存储,这是adj_list_vertex_property_map需要的。 To fix the problem you can either change your Graph typedef to include per-vertex storage for the vertex_index_t property or use an "external" property map such as associative_property_map . 要解决此问题,您可以更改Graph typedef以包含vertex_index_t属性的每顶点存储,或使用“external”属性映射(例如associative_property_map

The dijkstra-example-listS.cpp example uses the approach of changing the graph typedef . dijkstra-example-listS.cpp示例使用更改图形typedef To use this approach in your code, you could define: 要在代码中使用此方法,您可以定义:

typedef boost::adjacency_list <boost::listS, boost::listS, boost::directedS,
  boost::property<boost::vertex_name_t, std::string, boost::property<boost::vertex_index_t, int> >,
  boost::property<boost::edge_weight_t, Weight> > Graph;

If somebody is interested in the solution, Creating an associative_property_map as suggested in the previous answer solved the issue: 如果有人对该解决方案感兴趣,请按照上一个答案中的建议创建一个associative_property_map解决了这个问题:

   typedef std::map<vertex_desc, size_t>IndexMap;
   IndexMap mapIndex;
   boost::associative_property_map<IndexMap> propmapIndex(mapIndex);
   //indexing the vertices
     int i=0;
     BGL_FORALL_VERTICES(v, g, pGraph)
     {
        boost::put(propmapIndex, v, i++);
     }

Then pass this Vertex index map to the dijkstra_shortest_paths() call as a named parameter. 然后将此顶点索引映射作为命名参数传递给dijkstra_shortest_paths()调用。 PS: BGL_FORALL_VERTICES() is defined in < boost/graph/iteration/iteration_macros.hpp > PS:BGL_FORALL_VERTICES()在<boost / graph / iteration / iteration_macros.hpp>中定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用 Dijkstra 在提升图中找到最短路径 - Finding the shortest path in a boost graph using Dijkstra 如何可视化提升图并执行dijkstra的最短路径? - How to visualize the boost graph and perform dijkstra's shortest path? 当特定节点对之间存在多条最短路径时,boost graph dijkstra_shortest_paths 如何选择最短路径? - How does boost graph dijkstra_shortest_paths pick the shortest path when there are multiple shortest paths between a specific pair of nodes? 如何将有向图(邻接表)传递到 Dijkstra Algorithm Boost 中以找到最短路径? - How to Pass Direceted Graph (adjacency list) into Dijkstra Algorithm Boost to find shortest path? 为什么我不能将 listS 用于提升图的同构测试的 VertexList 模板参数? - Why can't I use listS for the VertexList template parameter for boost graph's isomorphism test? Boost中的自定义图形距离dijkstra_shortest_paths - Custom graph distance in Boost dijkstra_shortest_paths 增强图:dijkstra_shortest_paths:无法形成对“ void”的引用 - Boost graph: dijkstra_shortest_paths: cannot form a reference to 'void' boost :: dijkstra_shortest_paths覆盖内部图形权重? - boost::dijkstra_shortest_paths overwriting internal graph weights? dijkstra_shortest_paths Boost Graph Lib 1.57.0失败 - dijkstra_shortest_paths Boost Graph Lib 1.57.0 fails 浇水:图形实现问题 - 最短路径/ Dijkstra(?) - Water pouring: Graph Implementation Problem - Shortest Path/Dijkstra's (?)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM