增强图获取相邻顶点

时间:2015-07-21 13:15:32

标签: c++ algorithm boost graph

我正在使用Boost库进行图形处理。 该图定义如下。

 typedef boost::adjacency_list<boost::setS,boost::setS,boost::undirectedS, uint32_t, float> AdjacencyList;

在使用适当的数据创建图形之后,在一个单独的函数中,我想要打印每个顶点的adjacent_vertices,并使用在开头计算的适当边缘权重。

创建部分运行良好但是当我想提取相邻顶点时,我没有得到值。

typedef boost::graph_traits<AdjacencyList>::adjacency_iterator AdjacencyIterator;
AdjacencyList::vertex_iterator i, end;
for (boost::tie(i, end) = boost::vertices(adjacency_list); i != end; i++) {
AdjacencyIterator ai, a_end; 
boost::tie(ai, a_end) = boost::adjacent_vertices( *i, adjacency_list);
  for (; ai != a_end; ai++) { 
      std::cout << *ai << "\t";
  }
 }

我得到的输出是十六进制数的内存地址。 如何获得顶点索引和边缘权重?

1 个答案:

答案 0 :(得分:1)

您应该使用带有顶点/边描述符的图形operator[]或使用属性映射来访问属性包:

使用operator[]

<强> Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <iostream>

typedef boost::adjacency_list<boost::setS,boost::setS,boost::undirectedS, uint32_t, float> AdjacencyList;
typedef boost::graph_traits<AdjacencyList>::adjacency_iterator AdjacencyIterator;

int main() {
    AdjacencyList adjacency_list;;

    boost::add_edge(
            boost::add_vertex(10, adjacency_list),
            boost::add_vertex(20, adjacency_list),
            1.5f,
            adjacency_list
        );

    boost::add_edge(
            boost::add_vertex(30, adjacency_list),
            boost::add_vertex(40, adjacency_list),
            2.5f,
            adjacency_list
        );

    AdjacencyList::vertex_iterator i, end;

    for (boost::tie(i, end) = boost::vertices(adjacency_list); i != end; i++) {
        AdjacencyIterator ai, a_end; 

        boost::tie(ai, a_end) = boost::adjacent_vertices(*i, adjacency_list);
        for (; ai != a_end; ai++) { 
            std::cout << adjacency_list[*ai] << "\t";
        }
    }
}

输出:

10  20  30  40  

使用属性映射:

boost::property_map<AdjacencyList, boost::vertex_bundle_t>::type pmap = boost::get(boost::vertex_bundle, adjacency_list);

现在您可以使用boost::get(pmap, vertex_descriptor1)访问顶点属性包