如何使用boost将相同的边缘分组以生成点文件

时间:2018-07-13 19:08:36

标签: c++ boost graphviz

我有一个基于此example的代码,可以使用C ++生成点文件以将其转换为png文件。

我的问题如下:

我的点文件有时包含相同的边缘,因为它们是自动生成的。我希望能够将相同的边缘分组。我在点文件中的“ digraph G”之前添加了关键字“ strict”,并且可以正常工作。但是,我不想编辑点文件,而是在我的C ++软件中完成。在使用write_graphviz_dp()生成我的点文件时,boost中是否建议使用任何功能来添加此关键字?

下面是代码示例:

#include <boost/graph/adj_list_serialize.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/property_map/function_property_map.hpp>
#include <fstream>
using namespace boost;

struct VertexP { std::string tag; };
struct EdgeP { std::string symbol; };
struct GraphP { std::string orientation; };

typedef adjacency_list<vecS, vecS, directedS, VertexP, EdgeP, GraphP> Graph;

int main() {
    Graph g(GraphP{"LR"});
    // Then fill the graph
    add_edge(
        add_vertex(VertexP{ "tag1" }, g),
        add_vertex(VertexP{ "tag2" }, g),
        EdgeP{ "symbol" }, g
    );
    add_edge(
        add_vertex(VertexP{ "tag1" }, g),
        add_vertex(VertexP{ "tag2" }, g),
        EdgeP{ "symbol" }, g
    );    
    {
        std::ofstream dot_file("automaton.dot");
        dynamic_properties dp;
        dp.property("node_id", get(&VertexP::tag, g));
        dp.property("label", get(&VertexP::tag, g));
        dp.property("label", get(&EdgeP::symbol, g));
        dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("LR")));
        dp.property("dummy", boost::make_function_property_map<Graph*>([](Graph const* g) { return g->m_property->orientation; }));

        write_graphviz_dp(dot_file, g, dp);
    }
}

此代码提供了以下点文件:

digraph G {
dummy=LR;
rankdir=LR;
tag2 [label=tag2];
tag1 [label=tag1];
tag2 [label=tag2];
tag1 [label=tag1];
tag1->tag2  [label=symbol];
tag1->tag2  [label=symbol];
}

非常感谢您的帮助。

0 个答案:

没有答案