簡體   English   中英

使用自定義頂點標簽打印增強圖

[英]Print boost graph with custom vertex label

我想打印一個具有自定義(字符串)頂點標簽而不是默認頂點編號標簽0,1,2的Boost Graph。

我已將圖形初始化為:

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;形式的邊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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM