BGL : dijkstra_shortest_paths usage
BGL : dijkstra_shortest_paths usage
我很难使用dijkstra_shortest_paths()。下面是一个代码片段,它提供了大量的编译错误输出:
Vertex_t s = *departIter; /* VertexIterator_t departIter */
std::vector<Vertex_t> p( boost::num_vertices( this->m_g ) ); /* Graph_t m_g; */
std::vector<EdgeProperties_t> d( boost::num_vertices( this->m_g ) );
dijkstra_shortest_paths(
this->m_g, s, predecessor_map(&p[0]).distance_map(&d[0])
);
下面是我的代码中使用的typedef:
struct EdgeProperties_t {
EdgeProperties_t( float fWeight ) : m_fWeight( fWeight ) { }
EdgeProperties_t( ) : m_fWeight( static_cast<float>(0.0) ) { }
float m_fWeight;
};
struct VertexProperties_t {
std::string m_sName;
};
typedef adjacency_list<
vecS, listS, undirectedS, VertexProperties_t, EdgeProperties_t
> Graph_t;
typedef boost::graph_traits<Graph_t>::vertex_descriptor Vertex_t;
typedef boost::graph_traits<Graph_t>::vertex_iterator VertexIterator_t;
有人能告诉我它可能出了什么问题吗?我的眼睛好像被肥皂泡过了:(.
如果没有一个独立的源代码列表,很难提供帮助,但我认为一个问题是需要提供顶点索引映射。
然而,首先,std::vector<EdgeProperties_t> d(/*...*/);
是不正确的。距离贴图中的值类型应为边权重总和的CopyAssignable。在这种情况下,float
将起作用。
我试图使用您的图形类型defs修改BGL的dijkstra-example.cpp
,结果遇到了:
。。。在dijkstra示例.cpp:7:/usr/local/include/boost/graph/dijkstra_shortest_paths.hpp:613:8:错误:否用于调用"choose_const_pmap"的匹配函数choose_const_pmap(get_param(params,vertex_index),g,vertex_index),^~~~~~~~~~~~~~~~~dijkstra example.cpp:57:3:注意:在函数模板的实例化中专业化'boost::dijkstra_shortest_paths,boost::adj_list_edge_property_map,boost::edge_weight_t,boost::no_property>'此处请求dijkstra_shortest_path(g,^/usr/local/include/boost/graph/named_function_params.hpp:305:3:注意:候选者忽略模板:替换失败[带Param=boost::param_not_found,Graph=boost::邻接列表,PropertyTag=boost:vertex_index_t]choose_const_pmap(const Param&p、const Graph&g、PropertyTag标记)^生成3个错误。
这指示BGL在获取顶点的顶点索引方面存在问题。要解决此问题,可以为dijkstra_shortest_path()指定一个名为vertex_index_map的参数。
我为我的案例找到的解决方案是以下代码:
Vertex_t startVertex = *departIter;
std::vector<Vertex_t> p( graphSize );
std::vector<float> d( graphSize );
dijkstra_shortest_paths(this->m_g, startVertex, predecessor_map(&p[0]).distance_map(&d[0]));
和以下类型定义:
typedef adjacency_list< listS,
vecS,
undirectedS,
property < vertex_name_t, std::string >,
property < edge_weight_t, float > > Graph_t;
typedef boost::graph_traits<Graph_t>::vertex_descriptor Vertex_t;
如果在Graph_t定义中交换listS和vecS,您将面临许多编译问题。希望它能帮助别人。。。
如果它仍然是实际的,请尝试一下
#include <string>
#include <vector>
#include <boost/config.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/filtered_graph.hpp>
//using namespace boost;
struct EdgeProperties_t {
EdgeProperties_t( float fWeight ) : m_fWeight( fWeight ) { }
EdgeProperties_t( ) : m_fWeight( static_cast<float>(0.0) ) { }
float m_fWeight;
};
struct VertexProperties_t {
std::string m_sName;
};
typedef boost::adjacency_list<boost::vecS, boost::listS, boost::undirectedS, VertexProperties_t, EdgeProperties_t> Graph_t;
typedef boost::graph_traits<Graph_t>::vertex_descriptor Vertex_t;
typedef boost::graph_traits<Graph_t>::vertex_iterator VertexIterator_t;
int main(int argc, char *argv[])
{
Graph_t m_g;
//here you should fill your graph....
VertexIterator_t departIter = vertices(m_g).first; //iterator should point to first fertex in you graph
Vertex_t s = *departIter;
std::vector<Vertex_t> p( boost::num_vertices(m_g));
std::vector<float> d( boost::num_vertices(m_g)); //here you should use type of a field, not a structure itself
boost::dijkstra_shortest_paths(m_g, s, boost::weight_map(get(&VertexProperties_t::m_sName, m_g))
.predecessor_map(&p[0])
.distance_map(&d[0]));
}
相关文章:
- C++ Usage of AsyncCallback
- 方法错误"not all control paths return a value"和方法不返回值
- std::visit and std::variant usage
- QLoggingCategory::setFilterRules usage
- C++ std::initializer_list usage
- Paths.get( "abc/def.jpg" ) 在 C 和 C++ 中获取与操作系统无关的路径的等价物是什么?
- 警告:"Not all control paths return a value" c++
- Direct3D typedef usage
- Windows SetupAPI DIF_REMOVE usage
- C++ unique_ptr() Usage
- c++14 static constexpr auto with odr usage
- The usage of snprintf
- pcre2 UTF32 usage
- Qt QProccess with ping utility usage
- "QFileSystemWatcher: failed to add paths"但仍然有效
- "recursive on all control paths, function will cause runtime stack overflow"超载<<运算符
- Usage of InternetGetConnectedStateEx
- Usage of QOpenGLVertexArrayObject
- QtGstreamer camerabin2 usage
- pcl::PCLPointCloud2 usage