如有必要,删除边缘并拆分连接的组件(C ++,Boost)

时间:2014-07-25 17:53:06

标签: c++ algorithm boost graph

我有一个大图(顶点数可以在50,000-100,000范围内,邻接矩阵不需要稀疏)。可以删除/添加图表中的边缘,并且我希望在更改后更新生成的连接组件结构。我以简单的方式实现了这一点,我自己用C ++搜索BFS(跟踪unordered_map个顶点到连接的组件ID并更新它们,但我想知道是否有更有效的方法来做到这一点使用Boost的图库。

我在Stackoverflow中找到了一些与此类似的问题,并了解了filtered_graph(和connected_components函数),但我担心创建这样的过滤实例所涉及的开销,每次我们添加或删除边缘。 (或者这应该是一个关注点?!)

2 个答案:

答案 0 :(得分:3)

我相信您的解决方案基本上是最好的。如果只允许添加边,那么我相信可以通过跟踪包含的顶点连接的组件来改进算法,然后当包含边时,检查两个顶点是否属于不同的连通组件,在这种情况下,您合并两个连接的组件。这将降低从每个边缘添加的二次到最佳情况的复杂性。但是,如果您允许插入和删除边缘,我没有看到任何渐近更快的方法来解决问题,而不是您所描述的问题。

答案 1 :(得分:2)

有一些算法可以在边缘插入和删除下保持连接速度,而不是重新计算。这称为“动态图形连接”。 Here是一篇关于实验评估的论文(此后发现了一些较新的理论结果,但尚不清楚它们是否具有实际意义)。