【问题标题】:How to print a boost graph in graphviz with one of the properties displayed?如何在显示属性之一的graphviz中打印升压图?
【发布时间】:2012-02-29 04:07:21
【问题描述】:

我在使用属性映射时看到了这样的示例,但在使用结构处理顶点和边时没有看到(我认为这被称为“捆绑”)。

我在邻接列表图中定义了这样的顶点和边。

struct Vertex
{
    string name;
    int some_int;
};

struct Edge
{
    double weight;
};

图形构造如下:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, Vertex, Edge> boost_graph;

我想以Graphviz 格式打印这些对象的图表,以便将其作为图像查看。但是,我不仅想要节点和边。我还希望顶点上的属性name 和边缘上的weight 出现在图像中。我该怎么做?

【问题讨论】:

  • 我认为你应该展示一个完整的样本。我看不出你是如何用 Edge 'defined' 来构建树的。也许,边缘的映射属性?
  • @sehe 谢谢。我已将图形定义添加到问题中。边和顶点由函数 boost::add_edge 和 boost::add_vertex 添加
  • 您在寻找点格式定义吗? graphviz.org/Gallery.php 只需单击任何示例并查看制作它们所需的代码 :-)
  • @MartinKristiansen 谢谢。实际上,Boost 应该具有打印到我想利用的 graphviz 的功能

标签: c++ boost graph graphviz


【解决方案1】:

我只是偶然发现了这个问题。虽然它有一个公认的答案,但我想我也会添加我的版本。

您在图表中使用bundled property。从捆绑的属性中获取属性映射的正确方法是使用boost::get。所以你可以这样做:

boost::write_graphviz(std::cout, your_graph,
    boost::make_label_writer(boost::get(&Vertex::name, your_graph)),
    boost::make_label_writer(boost::get(&Edge::weight, your_graph)),
    );

your_graph 是您创建的图形对象。

【讨论】:

  • 我有同样的问题,但是,我有一个顶点类的方法,而不是公共属性,比如 class Vertex{ public: int getID();私人:int m_iID;};在这种情况下我应该怎么做才能将 ID 放入 graphviz 文件中?
【解决方案2】:

我第一次提供了错误的信息。这是正确的答案。

#include <boost/graph/graphviz.hpp>

using namespace boost;

// Graph type
typedef adjacency_list<vecS, vecS, directedS, VertexProperties, EdgeProperty> Graph;
Graph g;
std::vector<std::string> NameVec; // for dot file names


// write the dot file
std::ofstream dotfile (strDotFile.c_str ());
write_graphviz (dotfile, g, make_label_writer(&NameVec[0]));

【讨论】:

  • 谢谢,但我没有看到一个名为 WriteDOTFile 的方法。这是在哪里?
  • @MartinKristiansen 是的,但这并不能解释 .WriteDOTFile 函数在哪里?我不确定你在暗示什么。
  • 感谢您的更新。 make_label_writer 是否以某种方式从 Vertex 结构中挑选出字符串?
  • 是的,您为图中的每个节点加载带有字符串名称的向量。
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2021-08-27
  • 2020-04-20
  • 1970-01-01
相关资源
最近更新 更多