c++ - 如何在 Boost Dijkstra 中定义自定义距离?

标签 c++ boost graph dijkstra boost-graph

我目前正在查看 Boost Dijkstra 的文档 - http://www.boost.org/doc/libs/1_52_0/libs/graph/doc/dijkstra_shortest_paths.html ;我的目标是在计算距离时修改距离组合以获得“最大”而不是“加”。文档是这样说的:

IN: distance_combine(CombineFunction cmb)
This function is used to combine distances to compute the distance of a path. The
CombineFunction type must be a model of Binary Function. The first argument typ
of the binary function must match the value type of the DistanceMap property map
and the second argument type must match the value type of the WeightMap property
map. The result type must be the same type as the distance value type.
Default: closed_plus<D> with D=typename property_traits<DistanceMap>::value_type

定义这样一个 Combine 函数的语法是什么?我试过摸索 std::max,但我的编译器似乎对此并不满意。

最佳答案

我打算采用懒惰的方式,只提供一些代码来说明如何操作:)

#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/adjacency_list.hpp>

struct Edge {
        Edge(float weight_) : weight(weight_) {}
        float weight;
};

// simple function
float combine(float a, float b){
        return std::max(a, b);
}

// functor
struct Combine{
        // Some internal state

        float operator()(float a, float b) const {
                return std::max(a, b);
        }
};

int main(int, char**){
        typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::directedS, boost::no_property, Edge > graph_t;
        typedef boost::graph_traits < graph_t >::vertex_descriptor vertex_t;
        graph_t g;
        vertex_t a = boost::add_vertex(g);
        vertex_t b = boost::add_vertex(g);
        vertex_t c = boost::add_vertex(g);
        vertex_t d = boost::add_vertex(g);
        boost::add_edge(a, b, Edge(3), g);
        boost::add_edge(b, c, Edge(3), g);
        boost::add_edge(a, d, Edge(1), g);
        boost::add_edge(d, c, Edge(4), g);

        std::vector<vertex_t> preds(4);

        // Traditional dijsktra (sum)
        boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(boost::get(&Edge::weight,g)));
        assert(preds[c] == d);
        assert(preds[d] == a);

        // Dijkstra with custom combine as a function
        boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(boost::get(&Edge::weight,g)).distance_combine(&combine));
        assert(preds[c] == b);
        assert(preds[b] == a);

        // Dijkstra with custom combine as a functior
        boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(boost::get(&Edge::weight,g)).distance_combine(Combine()));
        // Dijkstra with custom combine as a lambda
        boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(boost::get(&Edge::weight,g)).distance_combine([](float a, float b){return std::max(a,b);}));

        return 0;
}

关于c++ - 如何在 Boost Dijkstra 中定义自定义距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13900198/

相关文章:

c++ - boost::detail::addr_impl_ref 的目的是什么?

python - 随机图Python networkx读取文件并绘制图表

c++ - 还使用 'extern template class' 语法时模板类静态成员变量的特化

c++ - boost::intrusive::unordered_set 桶中使用的是什么存储策略?

c++ - 确定预处理器 token 的值

iphone - 在发布版本中,Boost.Thread 线程未在 iPhone/iPad 上启动

c# - 用递归求解有向图

java - k-最短(替代)路径算法,java实现

c++ - std::map 比较指针

c++ - 建立SSL连接并发送GET信息