我有如下所示定义的邻接表。 在这一点上我需要访问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;
好吧,我想通了。 添加顶点属性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];
类型一的vertex_descriptor
依赖于底层结构VertexListS
-template的参数adjacency_list
。 我所知道的唯一案例,其中描述符是一个int
,当VertexList时-Type是vecS
。 但要记住:如果您选择vecS
作为VertexList时,所有类型(存储)描述符可以变得无效,当您更改图形的结构(如描述迭代器和描述符稳定性/无效 )。
我能吸引你在使用自定义顶点和边类型呢? 他们是非常非常容易的工作在自己的代码。 至于调用BGL算法,您可以使用捆绑的属性 。