有效地查找Boost BGL图中的所有可达顶点

时间:2018-12-11 12:32:05

标签: c++ boost graph depth-first-search boost-graph

我是新来提升图形库并尝试解决以下问题 问题:

在一个图表中(boost :: adjacency_list),我有3种不同的 顶点类型(使用std :: variant实现)和当前 无向边缘:

  1. 连接器(1)
  2. 切换(2)
  3. SwitchState(3)-(ON / OFF)

图中的典型层次结构如下:

(1a) - (2a) - (1b) - (1d) - (2b) - (1e)
        |                    |
       (3a)                 (3b)
        |                    |
       (1c)

我需要做的是找到所有可到达的顶点 从某个起点(例如1a)开始:

1a-> 2a-> 1b-> 1d-> 2b-> 1e

当然,仅使用BFS或DFS马上就会浮现出来! :-)

但是:顶点的状态(2)(开关或继电器) 由直接连接的状态(布尔)控制 顶点(3)。这意味着无法遍历 如果(3a)为(假设)为假,则通过(2a)从(1a)到(1b)。 最后:一个人无法从类型(2)遍历到类型(3)顶点。

我的问题是:是否有人对如何提出建议 有效地实现这样的图形遍历?我已经在普通的C ++中使用了许多矢量/地图等实现了此功能,并且已经在DFS中实现了,但是我想将代码移到底层图形的更高,更抽象(但希望仍然有效)的实现上!

我不确定是否应该:

  1. 使用filtered_graph只是使用BFS或DFS进行遍历?
  2. 然后根据3类顶点状态创建一个sub_graph并应用BFS / DFS?
  3. 有一种方法可以在通过BFS / DFSvisitor搜索时“即时”实现吗?
  4. 另一种解决方案?

非常欢迎有用的想法!

PS:该代码用于模拟电网-以防万一。

1 个答案:

答案 0 :(得分:1)

  

使用filtered_graph只是使用BFS或DFS进行遍历?

从概念上讲,过滤掉一个图形以“隐藏”关闭的边缘对我来说最简单。如果您的属性包足够简单(没有动态分配,也没有引用来帮助使用别名规则),那么编译器将在优化所有内容方面做得非常出色。

  

然后根据3类顶点状态创建一个sub_graph并应用BFS / DFS?

子图的开销很大,因此它们看起来不像您的票。

  

有一种方法可以在通过BFS / DFSvisitor搜索时“即时”实现吗?

我是这样认为的。您可以让访问者对“ examine_edge”事件进行操作,并在颜色图中标记下游顶点。您应该检查算法文档,以查看是否已记录了颜色图的语义。

  

如果是这样,即使从概念上讲,它比filtered_graph方法要复杂一点,但这似乎是最佳的解决方案。

如果没有,在基于未记录的实现细节进行优化之前,我会三思而后行。它可能会在将来的版本中中断,或者与例如库中隐藏的特殊情况。