使用自定义顶点标签打印增强图

时间:2013-12-04 04:46:59

标签: c++ boost graph

我想打印一个包含自定义(字符串)顶点标签的Boost Graph,而不是默认的顶点编号标签0,1,2 ......

我已将图初始化为:

typedef adjacency_list <vecS, vecS, directedS, 
                        property<vertex_name_t,string>
                       > Graph;

Graph g;
set<string> names; 
map<string,Graph::vertex_descriptor> vertex ;

for(auto it = names.begin() ; it != names.end(); ++it )
       vertex[*it] =  add_vertex(*it,g) ;

现在我应该如何打印此图表,以便获得格式abc -> xyz;的边缘,而不是1->2;

2 个答案:

答案 0 :(得分:4)

你可以从顶点描述符中get命名,例如

graph_traits<Graph>::edge_iterator it, end;
for(tie(it, end) = edges(g); it != end; ++it)
    std::cout << get(vertex_name, g)[source(*it, g)] << " -> "
              << get(vertex_name, g)[target(*it, g)] << '\n';

答案 1 :(得分:1)

我不是一个真正精通的BGL用户,但我发现你的方法存在一些问题:

1)您似乎在声明内部属性vertex_name,但后来使用外部存储空间set<string>

2)独立于此,我没有看到任何实际填充名称的代码,无论是内部还是外部情况 - 但我认为为简洁起见,您只是省略了它。

但是现在提出一个解决方案:BGL实际上有一种方法可以做你想做的事:boost::print_graph

using namespace boost;
typedef adjacency_list <vecS, vecS, directedS, 
                        property<vertex_name_t,string>
                       > Graph;
Graph g;

std::set<string> names;
// somehow populating names here...

// creating the vertices and storing the names as internal properties
for(auto it = names.begin() ; it != names.end(); ++it )
{ 
  auto v = add_vertex(g);
  put(vertex_name,g,/*vertex descriptor*/ *v,/*vertex name*/ *it);
}
print_graph(g,get(vertex_name,g)); //NOTE: you could also use an external property map or an adaptor