如何在boost :: grid_graph中使用给定的vertex_descriptor访问edge_descriptor [英] How to access edge_descriptor with given vertex_descriptor in boost::grid_graph

查看:163
本文介绍了如何在boost :: grid_graph中使用给定的vertex_descriptor访问edge_descriptor的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to change the weight of edges in my grid_graph but fail to access the edge_descriptor with:

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

其中gridboost::grid_graph<3>

然后我发现grid_graph不支持此功能.为了利用astar_search,在boost::grid_graph中使用给定的vertex_descriptor但没有adjacency_list的情况下,是否有任何便捷的方法来访问edge_descriptor?

Then I find out the grid_graph does not support this. In order to make use of the astar_search, is there any convenient way to access edge_descriptor with given vertex_descriptor in boost::grid_graph but not adjacency_list?

推荐答案

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

You can get the in/out edges for any particular node:

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网格进行演示(此示例显示了边缘节点的程度较低):

Demo using a 3d 4x4x4 grid with non-wrapping dimensions (this show-cases that the degree of nodes on the edges is lower):

在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)

这篇关于如何在boost :: grid_graph中使用给定的vertex_descriptor访问edge_descriptor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆