为depth_first_search定义ColorMap的最简单方法

时间:2018-12-20 19:08:34

标签: c++ boost boost-graph

我想使用depth_first_search算法。因为我需要 指定起始顶点的DFS版本,我也 必须定义一个ColorMap。那就是我想要的功能 使用:

template <class Graph, class DFSVisitor, class ColorMap>
void depth_first_search(const Graph& g, DFSVisitor vis, ColorMap color, 
             typename graph_traits<Graph>::vertex_descriptor start)

https://www.boost.org/doc/libs/1_67_0/libs/graph/doc/depth_first_search.html

由于地图对我而言无关紧要,因此默认的ColorMap就足够了。 您能给我一个提示,如何在depth_first_search中创建并传递它作为参数吗?

2 个答案:

答案 0 :(得分:3)

只需使用命名参数重载即可,这将使您可以在仅使用默认颜色图的同时指定起始顶点。

template <class Graph, class class P, class T, class R>
void depth_first_search(Graph& G, const bgl_named_params<P, T, R>& params);

示例:

boost::depth_first_search(graph, boost::root_vertex(start_vertex));

答案 1 :(得分:0)

我同意0x5453的回答。使用命名参数重载更容易。但是,如果您确实想知道如何初始化ColorMap对象,这就是答案。

  

默认值:使用大小为num_vertices(g)的default_color_type的std :: vector创建的iterator_property_map,并将i_map用于索引图。

Graph g;

/*
 * do something with graph
 */

// number of colors should be the same as number of vertices.
std::vector<boost::default_color_type> colors(boost::num_vertices(g));

// create a ColorMap object (cpp_version < 17)
auto color_map = boost::make_iterator_property_map(colors.begin(),
    boost::get(boost::vertex_index, g));

// In C++17, make_iterator_property_map isn't necessary, as we have class 
// template argument deduction
boost::iterator_property_map color_map(colors.begin(),
    boost::get(boost::vertex_index, g));

此处make_iterator_property_map接受两个参数并返回iterator_property_map。第一个参数是颜色值的迭代器,第二个参数是图形的顶点索引和colors索引之间的映射。