【问题标题】:Boost graph library: Get edge_descriptor or access edge by index of type intBoost 图形库:通过 int 类型的索引获取 edge_descriptor 或访问边缘
【发布时间】:2016-05-20 01:17:07
【问题描述】:

我是一个 BGL 新手,有一个(可能)简单的问题:我有一个有向图并使用捆绑属性作为边,其中一个是 int 类型的索引。知道唯一索引后,我想获取该边缘的相应 edge_descriptor 以便对其执行操作。下面的例子总结了我的问题:

#include <boost/graph/adjacency_list.hpp>

struct EdgeProperties {
    EdgeProperties(): distance(10), time_limit(5) {};
    int index;
    int distance;
    int time_limit;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperties> Graph;

int main() {

    Graph graph;

    EdgeProperties edge_prop1, edge_prop2, edge_prop3, edge_prop4;

    // Define edge properties
    edge_prop1.index = 0;
    edge_prop2.index = 1;
    edge_prop3.index = 2;
    edge_prop4.index = 3;

    // Add edges to graph
    boost::add_edge(0, 1, edge_prop1, graph);
    boost::add_edge(0, 2, edge_prop2, graph);
    boost::add_edge(1, 3, edge_prop3, graph);
    boost::add_edge(2, 3, edge_prop4, graph);

    // Get vertex_descriptor from an (int) index:
    int vertex_index = 2;
    boost::graph_traits<Graph>::vertex_descriptor v = boost::vertex(vertex_index, graph);

    // I would like to get an edge_descriptor from an (int) index property:
    // The following DOES NOT work:
    boost::graph_traits<Graph>::edge_descriptor e = boost::edge(edge_prop1.index, graph);
}

我也阅读了有关属性映射的信息,但找不到我的问题的解决方案。我更喜欢bundled properties 而不是内部属性。 有没有办法通过捆绑属性将唯一的 int 类型索引分配给边缘并通过这些 int 类型值访问边缘?

【问题讨论】:

    标签: c++ boost graph


    【解决方案1】:

    遗憾的是,我不认为 boost::graph 在这里可以立即提供帮助。

    首先,没有基于边缘属性的字段来查找边缘(或顶点)的机制 - BGL 保留任何此类映射,您拥有的“索引”字段完全用于您的目的.

    其次,有一个 boost::edges 函数,它返回一个迭代器范围,用于图的所有边。我虽然你可以将 vecS 作为边缘容器类型传递给 adjacency_list 模板,然后在这个范围内查看,但是根据http://www.boost.org/doc/libs/1_61_0/libs/graph/doc/EdgeListGraph.html,迭代器只需要是多通道输入迭代器,并且实现正是这样做的——即使使用vecS 作为边缘类型,不能随机访问。

    因此,似乎完成您想要的唯一方法是保留您自己的unodered_map 从索引到边缘描述符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2016-08-08
      • 2016-09-18
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多