我是新来提升图形库并尝试解决以下问题 问题:
在一个图表中(boost :: adjacency_list),我有3种不同的 顶点类型(使用std :: variant实现)和当前 无向边缘:
图中的典型层次结构如下:
(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中实现了,但是我想将代码移到底层图形的更高,更抽象(但希望仍然有效)的实现上!
我不确定是否应该:
非常欢迎有用的想法!
PS:该代码用于模拟电网-以防万一。
答案 0 :(得分:1)
使用filtered_graph只是使用BFS或DFS进行遍历?
从概念上讲,过滤掉一个图形以“隐藏”关闭的边缘对我来说最简单。如果您的属性包足够简单(没有动态分配,也没有引用来帮助使用别名规则),那么编译器将在优化所有内容方面做得非常出色。
然后根据3类顶点状态创建一个sub_graph并应用BFS / DFS?
子图的开销很大,因此它们看起来不像您的票。
有一种方法可以在通过BFS / DFSvisitor搜索时“即时”实现吗?
我是这样认为的。您可以让访问者对“ examine_edge”事件进行操作,并在颜色图中标记下游顶点。您应该检查算法文档,以查看是否已记录了颜色图的语义。
如果是这样,即使从概念上讲,它比filtered_graph方法要复杂一点,但这似乎是最佳的解决方案。
如果没有,在基于未记录的实现细节进行优化之前,我会三思而后行。它可能会在将来的版本中中断,或者与例如库中隐藏的特殊情况。