我一直在努力使用Boost框架实现Dijkstra的算法已有一段时间了,我似乎无法弄清楚我缺少的是什么。
使用在以下位置找到的示例:https://www.boost.org/doc/libs/1_67_0/libs/graph/doc/dijkstra_shortest_paths.html,
我在第36行收到错误
property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g);
class "boost::property_map<boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, boost::no_property, boost::property<boost::edge_weight_t, int, boost::no_property>, boost::no_property, boost::listS>, boost::edge_weight_t, void>" has no member "type"
我找不到其他人有同样的问题,我似乎无法解决问题所在。任何有关这个问题的帮助将不胜感激。
提前致谢
问题很可能是您无法在图表上定义边缘权重属性。例如。:
using graph_t = boost::adjacency_list</*boost::vecS, boost::vecS, boost::directedS, boost::no_property, boost::no_property*/>;
boost::property_map<graph_t, boost::edge_weight_t>::type weightmap = boost::get(boost::edge_weight, g);
不编译。你应该添加一个:
#include <boost/graph/adjacency_list.hpp>
using graph_t = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
boost::no_property,
boost::property<boost::edge_weight_t, double> >;
int main() {
graph_t g(5);
boost::property_map<graph_t, boost::edge_weight_t>::type weightmap = boost::get(boost::edge_weight, g);
}
你可以简化一点:
auto weightmap = get(boost::edge_weight, g);
或者考虑使用捆绑属性:
#include <boost/graph/adjacency_list.hpp>
struct EdgeProps {
double weight = 0.0;
};
using graph_t = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProps>;
int main() {
graph_t g(5);
auto weightmap = get(&EdgeProps::weight, g);
}