簡體   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