繁体   English   中英

在 Boost 图形库中排序的 sequential_vertex_coloring C++

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM