Самый простой способ определить ColorMap для deep_first_search - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу использовать алгоритм deep_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 будет вполне достаточно.Не могли бы вы дать мне подсказку, как его создать и передать в качестве аргумента в аргументе deep_first_search?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я согласен с ответом 0x5453.Проще использовать именованные параметры перегрузки.Но если вы хотите знать, как инициализировать ColorMap объект, вот ответ.

По умолчанию: iterator_property_map, созданный из std :: vector default_color_type размера num_vertices (g) ииспользуя 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 индексом.

0 голосов
/ 20 декабря 2018

Просто используйте вместо этого именованный параметр overload, который позволит вам указать начальную вершину, просто используя цветовую карту по умолчанию.

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));
...