【问题标题】:How to access edge_descriptor with given vertex_descriptor in boost::grid_graph如何在 boost::grid_graph 中使用给定的 vertex_descriptor 访问 edge_descriptor
【发布时间】:2017-04-03 13:44:10
【问题描述】:

我正在尝试更改 grid_graph 中边的权重,但无法通过以下方式访问 edge_descriptor:

std::pair<bEdgeDescriptor, bool> ed_right = boost::edge(bVertexDescriptor {{i - 1, j, k}}, bVertexDescriptor {{i, j, k}}, grid);

其中gridboost::grid_graph&lt;3&gt;

然后我发现grid_graph 不支持这个。为了使用astar_search,有没有方便的方法来访问edge_descriptor,在boost::grid_graph中给定vertex_descriptor而不是adjacency_list

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    您可以获得任何特定节点的入/出边:

    http://www.boost.org/doc/libs/1_63_0/libs/graph/doc/grid_graph.html#indexing

    // Get the out-edge associated with vertex and out_edge_index
    Traits::edge_descriptor
    out_edge_at(Traits::vertex_descriptor vertex,
                Traits::degree_size_type out_edge_index,
                const Graph& graph);
    
    // Get the out-edge associated with vertex and in_edge_index
    Traits::edge_descriptor
    in_edge_at(Traits::vertex_descriptor vertex,
               Traits::degree_size_type in_edge_index,
               const Graph& graph);
    

    演示使用具有非环绕尺寸的 3d 4x4x4 网格(这表明边缘上的节点度数较低):

    Live On Coliru

    #include <boost/graph/grid_graph.hpp>
    #include <boost/graph/adjacency_list.hpp>
    #include <iostream>
    
    using Grid = boost::grid_graph<3>;
    using Traits = boost::graph_traits<Grid>;
    using vertex_descriptor = Grid::vertex_descriptor;
    using edge_descriptor = Grid::edge_descriptor;
    
    static inline std::ostream& operator<<(std::ostream& os, vertex_descriptor const& vd) {
        return os << "(" << vd[0] << ", " << vd[1] << ", " << vd[2] << ")"; 
    }
    
    void print_in_edges(vertex_descriptor vd, Grid const& grid) {
        for (Traits::degree_size_type ei = 0; ei < in_degree(vd, grid); ++ei) {
            auto ed_left = in_edge_at(vd, ei, grid);
            std::cout << "Detected in edge: " << ed_left.first << " -> " << ed_left.second << "\n";
        }
    }
    
    void print_out_edges(vertex_descriptor vd, Grid const& grid) {
        for (Traits::degree_size_type ei = 0; ei < out_degree(vd, grid); ++ei) {
            auto ed_left = out_edge_at(vd, ei, grid);
            std::cout << "Detected out edge: " << ed_left.first << " -> " << ed_left.second << "\n";
        }
    }
    
    int main() {
        Grid grid({ { 4, 4, 4 } }, false);
    
        print_in_edges({{ 2, 2, 2 } }, grid);
        print_out_edges({{ 2, 2, 2 } }, grid);
        std::cout << "----\n";
        print_in_edges({{ 0, 0, 0 } }, grid);
        print_out_edges({{ 0, 0, 0 } }, grid);
    }
    

    打印:

    Detected in edge: (1, 2, 2) -> (2, 2, 2)
    Detected in edge: (3, 2, 2) -> (2, 2, 2)
    Detected in edge: (2, 1, 2) -> (2, 2, 2)
    Detected in edge: (2, 3, 2) -> (2, 2, 2)
    Detected in edge: (2, 2, 1) -> (2, 2, 2)
    Detected in edge: (2, 2, 3) -> (2, 2, 2)
    Detected out edge: (2, 2, 2) -> (1, 2, 2)
    Detected out edge: (2, 2, 2) -> (3, 2, 2)
    Detected out edge: (2, 2, 2) -> (2, 1, 2)
    Detected out edge: (2, 2, 2) -> (2, 3, 2)
    Detected out edge: (2, 2, 2) -> (2, 2, 1)
    Detected out edge: (2, 2, 2) -> (2, 2, 3)
    ----
    Detected in edge: (1, 0, 0) -> (0, 0, 0)
    Detected in edge: (0, 1, 0) -> (0, 0, 0)
    Detected in edge: (0, 0, 1) -> (0, 0, 0)
    Detected out edge: (0, 0, 0) -> (1, 0, 0)
    Detected out edge: (0, 0, 0) -> (0, 1, 0)
    Detected out edge: (0, 0, 0) -> (0, 0, 1)
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      相关资源
      最近更新 更多