删除加入它们的节点后确定剩余的子图

时间:2013-06-16 21:52:37

标签: algorithm data-structures graph-algorithm

所以我在尝试实现功能时遇到了这个问题:

假设我有一个随机的,无向的节点图,其中一些节点相互连接。

让我们将一组彼此可到达的节点调用到一组路径上。

现在,让我们假设图表只包含一个这样的集合(即,每个节点都可以从其他节点到达)。

如果我采用随机节点A并将其从集合中删除,我需要快速有效地确定哪些集合保留。如果A是集合中的切点,则删除它应该将集合分成两个或更多个较小的集合。我只需要一种有效的方法来做两件事:

  • 从集合中删除A并确定剩余集合,
  • 添加一个新节点B,其中包含将其连接到其他节点的任意数量的新边缘。

我需要能够适度地快速执行这两项操作。本质上,我正在寻找O(log(n))或O(1)解决方案。 O(n)解决方案是不可接受的,因为该图可能很大。我并不特别关心内存开销。任何人都可以指出我在这里使用哪种数据结构/算法的正确方向?我已经考虑过像Union-Find和Djikstra这样的东西,但它们并不适合我的需求。每次添加或删除节点时,我都不希望对整个图表运行完整的连接检查。

1 个答案:

答案 0 :(得分:1)

非常好paper by Henzinger and King。我认为它直接回答了你的问题。

此方法每次删除边(删除顶点等于删除与其相关的所有边)和O(log(n)/ loglog(n))最坏情况下分摊O(log ^ 3(n))复杂度每个查询的复杂度(在同一个连接组件中是v和u)。

此外,提出了该问题的许多变体,例如,如果只允许删除,你可以更快地完成它。