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