[英]sequential_vertex_coloring with ordering in Boost graph library C++
我是 boost 图形库的新手。 我正在尝试使用 sequential_vertex_coloring 算法 ( https://live.boost.org/doc/libs/1_79_0/libs/graph/doc/sequential_vertex_coloring.html ) 并让工作代码使用 order 参数的默认值。 但我想传递一个顺序属性 map,它以最大度顺序列出我的图形的顶点(这样我的着色算法就是 Welsh-Powell)。 上面文档中的示例没有显示如何执行此操作。 有人可以举一个最小的例子来说明如何创建这样的属性 map。
首先,我必须对您未显示的代码做出假设。 让我们假设默认顺序调用是这样的:
#include <boost/graph/sequential_vertex_coloring.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <iostream>
using Graph =
boost::adjacency_list<boost::listS, boost::vecS, boost::bidirectionalS>;
using V = boost::graph_traits<Graph>::vertex_descriptor;
using Edge = std::pair<int, int>;
enum nodes { A, B, C, D, E, n };
int main() {
Edge edges[] = {{A, C}, {B, B}, {B, D}, {B, E}, {C, B},
{C, D}, {D, E}, {E, A}, {E, B}};
Graph g(std::begin(edges), std::end(edges), n);
std::vector<unsigned> color_vec(num_vertices(g));
auto index_map = get(boost::vertex_index, g);
// default order
auto color_map = make_safe_iterator_property_map(
color_vec.begin(), color_vec.size(), index_map);
auto num_colors = sequential_vertex_coloring(g, color_map);
std::cout << "num_colors: " << num_colors << "\n";
}
印刷
num_colors: 2
您传递满足记录标准的属性 map(就像color_map
一样):
从 [0, num_vertices(g)) 范围内的整数到图的顶点的映射。
因此,让我们创建一个顶点描述符向量:
std::vector<V> ordering;
并用自然顺序填充它:
auto vv = vertices(g);
ordering.assign(vv.first, vv.second);
然后按程度排序(降序):
sort(begin(ordering), end(ordering),
[&g](V v, V u) { return degree(v, g) > degree(u, g); });
现在我们以与颜色 map 相同的方式从向量创建属性 map:
auto order_map = make_safe_iterator_property_map(
ordering.begin(), ordering.size(), index_map);
现在剩下的就是将它作为参数传递给sequential_vertex_coloring
的另一个重载:
auto num_colors = sequential_vertex_coloring(g, order_map, color_map);
num_colors: 2
num_colors: 2
加上一点 Boost Range 魔法,线条
std::vector<V> ordering;
{
auto vv = vertices(g);
ordering.assign(vv.first, vv.second);
sort(begin(ordering), end(ordering),
[&g](V v, V u) { return degree(v, g) > degree(u, g); });
}
可以简化为
auto ordering = boost::copy_range<std::vector<V>>(vertices(g));
sort(begin(ordering), end(ordering),
[&g](V v, V u) { return degree(v, g) > degree(u, g); });
然后,使用 std::ranges 甚至更多:
auto ordering = boost::copy_range<std::vector<V>>(vertices(g));
std::ranges::sort(ordering, std::greater<>{},
[&g](V v) { return degree(v, g); });
只是为了比较,看到按最小度数排序时需要更多 colors:
num_colors: 2
num_colors: 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.