如何访问BGL的vertex_descriptor的为int(how to access BGL&#

2019-09-19 22:43发布

我有如下所示定义的邻接表。 在这一点上我需要访问vertex_descriptor的整数类型。 我怎样才能做到这一点tvertex source = ...; int source_as_int = ???source??? tvertex source = ...; int source_as_int = ???source??? 我记得我碰到同样的问题之前,解决它,但不记得如何使用它作为参考的BGL文件是没用的,他们应该尝试看看,并从学习的Javadocs。

另一种可能是使用的一个可能的成员函数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;

Answer 1:

好吧,我想通了。 添加顶点属性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];


Answer 2:

类型一的vertex_descriptor依赖于底层结构VertexListS -template的参数adjacency_list 。 我所知道的唯一案例,其中描述符是一个int ,当VertexList时-Type是vecS 。 但要记住:如果您选择vecS作为VertexList时,所有类型(存储)描述符可以变得无效,当您更改图形的结构(如描述迭代器和描述符稳定性/无效 )。



Answer 3:

我能吸引你在使用自定义顶点和边类型呢? 他们是非常非常容易的工作在自己的代码。 至于调用BGL算法,您可以使用捆绑的属性 。



文章来源: how to access BGL's vertex_descriptor as an int
标签: c++ boost