2012-07-20 31 views
4

我有一個如下所示的相鄰列表定義。在這一點上,我需要訪問vertex_descriptor作爲int類型。我該怎麼做tvertex source = ...; int source_as_int = ???source???我記得之前碰到過這個相同的問題並且解決了它,但是不記得BGL文檔是如何用作參考的,它們應該試着從Javadocs中學習和學習。如何訪問BGL的vertex_descriptor作爲int

另一種可能性是使用vertex_descriptor類型的可能成員函數或者其他一些全局BGL函數用於此目的......一個人不知道在哪裏尋找這個,他們似乎隨機選擇做全局函數或成員功能,如果你問我,直覺設計就會失敗。

typedef adjacency_list_traits<setS, setS, bidirectionalS> ttraits; 

typedef adjacency_list<setS, setS, bidirectionalS, 
     // vertex properties 
     property<vertex_color_t, default_color_type>, 
     // edge properties 
     property<edge_capacity_t, int, 
     property<edge_residual_capacity_t, int, 
     property<edge_reverse_t, ttraits::edge_descriptor> > >, no_property, vecS> tbgl_adjlist_bidir; 

typedef graph_traits<tbgl_adjlist_bidir>::vertex_descriptor  tvertex; 
typedef graph_traits<tbgl_adjlist_bidir>::edge_descriptor  tedge; 
typedef property_map<tbgl_adjlist_bidir, edge_capacity_t>::type tedge_capacity_map; 
typedef property_map<tbgl_adjlist_bidir, edge_reverse_t>::type treverse_edge_map; 
typedef property_map<tbgl_adjlist_bidir, vertex_color_t>::type tvertex_color_map; 
typedef graph_traits<tbgl_adjlist_bidir>::out_edge_iterator  tout_edge_iterator; 
typedef graph_traits<tbgl_adjlist_bidir>::in_edge_iterator  tin_edge_iterator; 

回答

4

好吧,我想通了。添加頂點屬性vertex_index_t可解決問題。然後我就可以像這樣訪問的頂點INT指數:

typedef adjacency_list_traits<setS, vecS, bidirectionalS> ttraits; 

typedef adjacency_list<setS, vecS, bidirectionalS, 
     // vertex properties 
     property<vertex_index_t, int, 
     property<vertex_color_t, default_color_type> >, 
     // edge properties 
     property<edge_capacity_t, int, 
     property<edge_residual_capacity_t, int, 
     property<edge_reverse_t, ttraits::edge_descriptor> > >, no_property, vecS> tbgl_adjlist_bidir; 

typedef graph_traits<tbgl_adjlist_bidir>::vertex_descriptor  tvertex; 
typedef graph_traits<tbgl_adjlist_bidir>::edge_descriptor  tedge; 
typedef property_map<tbgl_adjlist_bidir, edge_capacity_t>::type tedge_capacity_map; 
typedef property_map<tbgl_adjlist_bidir, edge_reverse_t>::type treverse_edge_map; 
typedef property_map<tbgl_adjlist_bidir, vertex_color_t>::type tvertex_color_map; 
typedef property_map<tbgl_adjlist_bidir, vertex_index_t>::type tvertex_index_map; 
typedef graph_traits<tbgl_adjlist_bidir>::vertex_iterator  tvertex_iterator; 
typedef graph_traits<tbgl_adjlist_bidir>::edge_iterator   tedge_iterator; 
typedef graph_traits<tbgl_adjlist_bidir>::out_edge_iterator  tout_edge_iterator; 
typedef graph_traits<tbgl_adjlist_bidir>::in_edge_iterator  tin_edge_iterator; 

然後我用這樣的:

tbgl_adjlist_bidir bgl_adjlist_bidir; 
    // ... 
    tvertex_index_map indices = get(vertex_index, bgl_adjlist_bidir); 
    // ... 
    tvertex source; 
    // ... 
    int source_as_int = indices[source]; 
1

類型一個vertex_descriptor的取決於adjacency_listVertexListS -template參數的底層結構。我知道的唯一情況是,當VertexList-Type是vecS時,描述符是int。但請記住:如果您選擇vecS作爲您的VertexList-Type所有(存儲)描述符可能會失效,當您更改圖形的結構時(如Iterator and Descriptor Stability/Invalidation中所述)。

相關問題