增强图:迭代所有顶点并打印相邻顶点

时间:2018-05-18 08:22:40

标签: c++ boost graph adjacency-list

我想打印所有顶点及其相邻顶点。我在网上找到了一些关于如何做到这一点的例子,但它对我不起作用。我收到错误,++运算符不能用于ai。另外我认为它必须是vertex_idMap[*ai]而不是vertex_idMap[ai],但这会引发错误。有谁知道为什么这是错的?

typedef adjacency_list<vecS, listS, directedS, VertexIDPorperty, EdgeWeight> Graph;  //the type of g
graph_traits <Graph>::vertex_iterator i, end;
graph_traits <Graph>::adjacency_iterator ai, a_end;
for (boost::tie(i, end) = vertices(g); i != end; ++i) {
    std::cout << vertex_idMap[*i];
    for (; ai != a_end; ++ai) {   //the ++ai seems to be wrong?
        std::cout << vertex_idMap[ai];
        if (boost::next(ai) != a_end)
            std::cout << ", ";
    }
std::cout << std::endl;

1 个答案:

答案 0 :(得分:1)

观察:

  1. 其余代码在哪里?这显然取决于使用的类型。
  2. aia_end尚未初始化(也许您实际上并不意味着代码无法编译,这是您的整个问题)
  3. vertex_idMap[ai]无法编译,因为vertex_iterator不是有效vertex_descriptor
  4. 这是一个固定的例子,想象中缺少的部分:

    <强> Live On Coliru

    #include <boost/graph/adjacency_list.hpp>
    #include <iostream>
    
    using VertexIDPorperty = boost::property<boost::vertex_index_t, int>;
    using EdgeWeight       = boost::property<boost::edge_weight_t, double>;
    typedef boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, VertexIDPorperty, EdgeWeight> Graph;
    
    Graph sample();
    
    int main() {
        Graph g = sample();
        auto vertex_idMap = get(boost::vertex_index, g);
        boost::graph_traits <Graph>::vertex_iterator i, end;
        boost::graph_traits <Graph>::adjacency_iterator ai, a_end;
    
        for (boost::tie(i, end) = vertices(g); i != end; ++i) {
            std::cout << vertex_idMap[*i] << ": ";
    
            for (boost::tie(ai, a_end) = adjacent_vertices(*i, g); ai != a_end; ++ai) {
                std::cout << vertex_idMap[*ai];
                if (boost::next(ai) != a_end)
                    std::cout << ", ";
            }
            std::cout << std::endl;
        }
    }
    

    实施sample()以创建随机图表:

    #include <boost/graph/random.hpp>
    #include <random>
    
    Graph sample() {
        Graph g;
        std::mt19937 prng { std::random_device{}() };
    
        generate_random_graph(g, 10, 20, prng);
        int id = 0;
        for (auto vd : boost::make_iterator_range(vertices(g))) {
            put(boost::vertex_index, g, vd, ++id);
        }
    
        return g;
    }
    

    它打印的内容如下:

    1: 9, 9, 4
    2: 6
    3: 
    4: 
    5: 9, 9, 8, 9
    6: 9, 3, 1
    7: 2, 10
    8: 6
    9: 8
    10: 7, 3, 8, 1, 4
    

    开箱即用

    打印图表可以更简单:

    #include <boost/graph/graph_utility.hpp>
    // ...
    
    int main() {
        print_graph(sample());
    }
    

    <强> Live On Coliru

    1 --> 
    2 --> 3 10 9 6 6 10 
    3 --> 8 
    4 --> 
    5 --> 4 
    6 --> 1 5 8 
    7 --> 4 9 2 2 1 
    8 --> 6 
    9 --> 5 7 
    10 --> 7