adjacency_list中的常量顶点id

时间:2017-05-17 22:46:15

标签: boost graph boost-graph adjacency-list

我想保留adjacency_list图(以及顶点组)的顶点和边的外部属性。我需要能够通过其属性访问顶点。 例如,我想迭代分配了一些权重的所有顶点,并获得它们的边缘。

但是,我还需要将我的顶点容器设置为setS。 在此容器中,添加\删除顶点可能会使顶点描述符无效。

问题是外部属性现在可以映射到无效的vertex_descriptors。

    class manage_data {
...
    auto get_interesting(int weight) {
        return ver_by_weight.equal_range(weight);
    }
    void do_stuff (...) {
        auto for_later_use = get_interesting();
        ...
        boost::remove_vertex(unrelated_vertex, graph_);
        ...
        use_vec(for_later_use.front()); //bug
    }
    }

一种方法似乎是添加vertex_index属性。这不起作用,因为它是一个方向 - 您可以通过vertex_descriptor获取vertex_index,但不能反过来。这意味着我不能在我只知道索引的两个顶点之间添加边。

另一个有希望的解决方案是使用标记图。此图表只能通过标签添加边缘。通过存储带有标签ID的外部数据,我可以做得很好。不幸的是,并非所有的adjacency_list接口都使用标签重新实现 - 例如out_edges。这意味着我仍然需要能够访问顶点描述符,并且不可能(在合理的时间内)仅使用标签,可以看到here

更好的解决方案是将上述两个结合起来 - 具有vertex_label属性。这似乎过于复杂,并且不起作用(上例)。

顶点与外部数据相关应该不常见吗?你怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您可以使用从顶点描述符到您自己的ID的双向映射。

现在,只要您为顶点容器使用任何基于节点的容器选择器,就可以全部设置。

看看BiMap以及可能transform_value_property_map以获得最大的便利性(尽管你可能不需要所有的幻想,特别是如果图形主要是只读的 - 或仅收缩 - 例如。)

另见