繁体   English   中英

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

[英]Removing edges and splitting a connected component if necessary (C++, Boost)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM