我有一个邻接列表,如下所示。此时我需要访问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;
答案 0 :(得分: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];
答案 1 :(得分:1)
vertex_descriptor
的类型取决于VertexListS
的基础结构 - adjacency_list
的模板参数。当VertexList-Type为int
时,我知道的唯一情况是描述符是vecS
。但请记住:如果选择vecS
作为VertexList-Type,则所有(存储的)描述符都可能无效,当您更改图表的结构时(如Iterator and Descriptor Stability/Invalidation中所述)。
答案 2 :(得分:1)
我是否会对您使用自定义顶点和边缘类型感兴趣?它们在您自己的代码中非常多easier to work with。至于调用BGL算法,您可以使用Bundled Properties。