手动为 boost 的图表着色

2023-12-04

我正在努力尝试使用 boost 手动为图的顶点着色。我写了下面的代码,但我不明白为什么生成的文件没有任何颜色。

int main(int,char*[]) {
    typedef property<edge_name_t, string> EdgeProperties;
    typedef property<vertex_name_t, string, property<vertex_color_t, default_color_type>> VertexProperties;
    typedef adjacency_list<vecS, vecS, directedS, VertexProperties, EdgeProperties> Graph;
    typedef graph_traits<Graph>::vertex_descriptor Vertex;
    typedef graph_traits<Graph>::edge_descriptor Edge;

    Graph g;
    property_map<Graph, vertex_name_t>::type vertex_label = get(vertex_name, g);
    property_map<Graph, vertex_color_t>::type color_map = get(vertex_color, g);
    property_map<Graph, edge_name_t>::type edge_label = get(edge_name, g);

    Vertex v1 = add_vertex(g);
    vertex_label[v1] = "v1";

    put(color_map, v1, boost::red_color);

    std::ofstream outf("example.gv");
    write_graphviz(outf, g,
                   make_label_writer(vertex_label),
                   make_label_writer(edge_label)
                   );
    return 0;
}

顶点着色实际上是一个算法细节。据我所知,没有“自动”规定可以将其转换为 graphviz。

不过,您可以添加自定义属性。

我通常会更改它以使用动态属性:

std::ofstream outf("example.gv");

dynamic_properties dp;
dp.property("node_id", get(vertex_index, g));
dp.property("label", vertex_label);
dp.property("label", edge_label);

write_graphviz_dp(outf, g, dp);

现在就像向动态集中添加新的顶点属性一样简单:

dp.property("color", make_transform_value_property_map(&color_to_string, color_map));

唯一的复杂之处是您需要提供以下转换:default_color_type到文本。这是彩色图通常不用于表示目的这一事实的另一个症状。这是一个完整的工作示例:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <iostream>
using namespace boost;

inline char const* color_to_string(default_color_type c) {
    switch(c) {
        case default_color_type::red_color:   return "red";
        case default_color_type::green_color: return "green";
        case default_color_type::gray_color:  return "gray";
        case default_color_type::white_color: return "white";
        case default_color_type::black_color: return "black";
    }
    return ""; // not known
}


int main() {
    typedef property<edge_name_t, std::string> EdgeProperties;
    typedef property<vertex_name_t, std::string, property<vertex_color_t, default_color_type>> VertexProperties;
    typedef adjacency_list<vecS, vecS, directedS, VertexProperties, EdgeProperties> Graph;
    typedef graph_traits<Graph>::vertex_descriptor Vertex;

    Graph g;
    property_map<Graph, vertex_name_t>::type vertex_label = get(vertex_name, g);
    property_map<Graph, vertex_color_t>::type color_map = get(vertex_color, g);
    property_map<Graph, edge_name_t>::type edge_label = get(edge_name, g);

    Vertex v1 = add_vertex(g);
    vertex_label[v1] = "v1";

    put(color_map, v1, boost::red_color);

    dynamic_properties dp;
    dp.property("node_id", get(vertex_index, g));
    dp.property("label", vertex_label);
    dp.property("label", edge_label);
    dp.property("color", make_transform_value_property_map(&color_to_string, color_map));

    write_graphviz_dp(std::cout, g, dp);
}

Prints:

digraph G {
0 [color=red, label=v1];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手动为 boost 的图表着色 的相关文章

随机推荐

  • C 指针:数组变量

    我在我的书中读到了这一点 以及互联网上的许多来源 数组变量points到数组中的第一个元素 如果为真 则数组变量和第一个元素是不同的 Right 这意味着通过下面的代码 它将产生两种不同的结果 int main char msg stack
  • 有没有办法在 Javascript 中组合对象

    我正在用 Javascript 进行一些数据清理 我想知道是否有一种方法可以根据通用 ID 组合对象 鉴于以下情况 subject Hadji Singh predicate nameOfUser id 3f540200 58b9 40a5
  • R Kruskal-Wallis 与多个因素

    我正在寻求帮助 对我的数据集执行大量因素的 Kruskal Wallis 检验 我可以对单个因素进行测试 例如 AD 1yr kruskal test Shannon AD 1y data comm 但我想要测试 50 多个因素 并且希望有
  • C 中未定义长度的数组

    我正在看教科书中的一个练习 内容是 创建一个 C 程序 从键盘获取长度为 N 的数组 问题是 在C语言中 如何创建未定义长度的数组 谢谢你们 不要创建未定义长度的数组 After得到需要的长度N 如果 C99 使用 VLA 可变长度数组 i
  • 垂直对齐位于浮动同级旁边的 Div 中的多行文本

    我有两个兄弟姐妹 其中一个占据父级宽度的 70 并向左浮动 它有一个clip path创建不规则多边形 同级 div 的宽度为父级 div 的 100 我已经放了一个shape outside浮动 div 上的属性允许同级中的文本以遵循多边
  • SupportMapFragment 或 GoogleMap 为 null

    设法使代码没有错误 但是在启动时 我总是在 mMap mapFrag getMap 行处收到空指针异常 为什么会这样呢 我是否缺少一些导入或一些步骤 我不确定是否是 SupportMapFragment 或 GoogleMap 对象导致了问
  • Plone 中是否有一种简单的方法可以在新用户加入门户时收到电子邮件通知?

    我希望每当新用户加入门户时都会向门户电子邮件地址发送电子邮件通知 我的猜测是我应该编写一个新产品来做到这一点 这样的产品是否已经存在 针对 Plone 4 我检查了内容规则 但据我所知 只有当我让用户对膜 记住之类的东西感到满意时 它才能起
  • 使用 PHP xmlwriter 在 xml 文件中添加多个数据

    我需要为每个月添加文章xml使用 PHP 文件xmlwriter sql SELECT YEAR FROM UNIXTIME timestamp AS YEAR MONTH FROM UNIXTIME timestamp AS MONTH
  • d3.js:从文件中绘制地图上两点之间的弧

    我是 d3 js 的新手 正在尝试一些简单的事情 我绘制了一张读取 file1 和 file2 的世界地图 file2 按索引 ID 纬度和经度列出机场 file1 通过机场的索引 ID 来对机场进行配对 我想画一条弧线 一条线或任何东西来
  • 依赖性跟踪功能

    我只是想知道是否有人知道如何在运行后自动创建视图DROP CASCADE 现在我试图首先放弃经典的视图DROP VIEW myview语句 如果我无法删除视图 因为其他对象仍然依赖于它 那么检查 postgres 列出的所有对象名称并保存它
  • Reactjs读取属性文件?

    我在寻找解决方案时遇到困难如何在reactJS中读取属性文件 我读过您可以使用模块 properties reader 但我似乎无法使要求工作 有简单的方法吗 例如 import React Component from react imp
  • Github - 需要有关发出拉取请求的帮助

    我分叉了一个项目 进行了更改 C1 并提出了仍待处理的拉取请求 一周后 我想提出另一个带有更改的拉取请求 C2 与此同时 上游 我分叉的地方 发生了很多变化 所以我想将我的 master 与上游同步 并且需要单独提供带有更改 C2 的拉取请
  • 类型或命名空间“Mvc”名称在命名空间“System.Web”中不存在

    我有一个使用 RazorEngine 生成电子邮件的类库 RazorEngine 使用 Mvc 我在我的库类中引用了 System Web Mvc 将其设置为复制本地 并且它存在于 Bin 文件夹中 但是我仍然得到这个例外 我让它工作的唯一
  • 这是在我的程序中嵌入调试消息的好方法吗? (宏)

    在 Debug h 文件中 我有以下内容 ifdef DEBUG FLAG define DEBUG msg std cerr lt lt msg lt lt std endl else define DEBUG msg for true
  • 托管 C# dll 上的 GetProcAddress

    我正在尝试通过 LoadLibrary 加载 C dll 我能够成功加载它 您能告诉我如何使用此 dll 的 GetProcAddress 以便我可以使用此 dll 中定义的方法和类型吗 提前致谢 EDIT 1 解决此问题的最佳方法是 CO
  • Web USB 从设备到浏览器传输数据无法正常工作

    上面是我的设备配置 我正在尝试从中获取数据 我正在使用下面的代码来获取数据 document getElementById request onclick function navigator usb requestDevice filte
  • java httpssession有效吗?

    我在 tomcat 中使用 java servlet API 我将用户名和带有属性用户名的 httpsession 保存在哈希表中 我想知道是否有办法检查 httpsession 是否有效 我试过了 try String user http
  • Google Chrome 错误 - 溢出:自动 |滚动不起作用

    这是我在 Chrome 中的网站 文本在框外运行 这是在 IE 中没有问题 这是相关的CSS section height 1000px width 670px border thick solid rgb 51 97 120 border
  • windows和spyder中的python多处理问题

    我的大学有一个关于 python 多重处理的项目 对于我的 python 项目 我在 Windows 中使用spyder 因此 我尝试在spyder中运行一个非常简单的多处理代码 但每次我运行它时 spyder控制台都会冻结并且永远不会完成
  • 手动为 boost 的图表着色

    我正在努力尝试使用 boost 手动为图的顶点着色 我写了下面的代码 但我不明白为什么生成的文件没有任何颜色 int main int char typedef property