打印带有自定义顶点标签的助推图

Print boost graph with custom vertex label

本文关键字:标签 顶点 自定义 打印      更新时间:2023-10-16

我想打印一个具有自定义(字符串)顶点标签的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;的边

您可以从顶点描述符中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';

我不是一个真正精通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