4

我有一个定义如下所示的邻接列表。此时我需要将 vertex_descriptor 作为 int 类型访问。我怎么能做到这一点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;
4

3 回答 3

5

好的,我想通了。添加顶点属性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];
于 2012-07-20T15:03:14.773 回答
1

a 的类型vertex_descriptor取决于 的VertexListS-template 参数的底层结构adjacency_list。我知道的唯一情况int是,当 VertexList-Type 是时,描述符是 an vecS。但请记住:如果您选择vecSVertexList-Type 作为您的 VertexList-Type,那么当您更改图形的结构时(如迭代器和描述符稳定性/无效中所述),所有(存储的)描述符都可能变得无效。

于 2012-07-20T14:55:09.600 回答
1

我可以对您使用自定义顶点和边类型感兴趣吗?在您自己的代码中使用它们要容易得多。至于调用 BGL 算法,您可以使用Bundled Properties

于 2012-07-20T15:21:03.810 回答