我有一个大图(顶点数可以在50,000-100,000范围内,邻接矩阵不需要稀疏)。可以删除/添加图表中的边缘,并且我希望在更改后更新生成的连接组件结构。我以简单的方式实现了这一点,我自己用C ++搜索BFS(跟踪unordered_map
个顶点到连接的组件ID并更新它们,但我想知道是否有更有效的方法来做到这一点使用Boost
的图库。
我在Stackoverflow中找到了一些与此类似的问题,并了解了filtered_graph
(和connected_components
函数),但我担心创建这样的过滤实例所涉及的开销,每次我们添加或删除边缘。 (或者这应该是一个关注点?!)
答案 0 :(得分:3)
我相信您的解决方案基本上是最好的。如果只允许添加边,那么我相信可以通过跟踪包含的顶点连接的组件来改进算法,然后当包含边时,检查两个顶点是否属于不同的连通组件,在这种情况下,您合并两个连接的组件。这将降低从每个边缘添加的二次到最佳情况的复杂性。但是,如果您允许插入和删除边缘,我没有看到任何渐近更快的方法来解决问题,而不是您所描述的问题。
答案 1 :(得分:2)
有一些算法可以在边缘插入和删除下保持连接速度,而不是重新计算。这称为“动态图形连接”。 Here是一篇关于实验评估的论文(此后发现了一些较新的理论结果,但尚不清楚它们是否具有实际意义)。