Как напечатать буст-график в графвизе с одним из отображаемых свойств? - PullRequest
6 голосов
/ 07 февраля 2012

Я вижу примеры этого при использовании карт свойств, но не при использовании структур для обработки вершин и ребер (я думаю, это называется «связками»).

У меня есть вершины и ребра, определенные как таковые,в графе списка смежности.

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 на краях появлялся на изображении.Как я могу это сделать?

Ответы [ 2 ]

24 голосов
/ 10 апреля 2012

Я просто наткнулся на этот вопрос. Хотя ответ на него принят, я думал, что тоже добавлю свою версию.

Вы используете связанное свойство в своем графике. Правильный способ получить карту свойств из ваших связанных свойств - использовать 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 - созданный вами объект графа.

6 голосов
/ 08 февраля 2012

Я дал плохую информацию в первый раз.Вот правильный ответ.

#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]));
...