【问题标题】:constant vertex ids in adjacency_listadjacency_list 中的常量顶点 ID
【发布时间】:2017-05-17 22:46:15
【问题描述】:

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

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

问题是外部属性现在可以映射到无效的顶点描述符。

    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 接口都使用标签重新实现 - 例如外边。这意味着我仍然需要能够访问顶点描述符,并且(在合理的时间内)仅使用标签是不可能的,如here

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

顶点与外部数据关联不应该很常见吗?你是怎么做到的?

【问题讨论】:

  • “所有顶点都分配了一些权重” - 你是说边吗?
  • 否,如示例代码 - ver_by_weight.equal_range(weight) 。

标签: boost graph boost-graph adjacency-list


【解决方案1】:

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

现在,只要您为顶点容器使用任何基于节点的容器选择器,就大功告成了。

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

另见

【讨论】:

  • 当顶点描述符失效时如何使用双向映射?我只能使用内部属性,因此图形类将更新我的顶点描述符。 BGL 是否具有内部双向属性?
  • 什么是基于节点的容器选择器? :)
  • 基于节点的数据结构分配使用节点。所以,listSsetS 可以。 “当顶点描述符变得无效时”-在使用这些基于节点的容器时它们不会¹。 (¹ 只有实际删除的描述符才会失效)
  • 太棒了。然后这些容器正是我要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多