三次图的动态递减连通性

时间:2017-07-10 21:31:10

标签: algorithm graph shortest-path

假设我有一个完全连接的无向图(节点和边),它受到所有节点代表3D空间坐标这一事实的约束,如果节点代表相邻的立方体,则节点只能在图中相邻,即(1,0 ,8)可以与(0,0,8)或(2,0,8)或(1,0,9)相邻。

现在假设我动态地从图中删除节点。我想要一个算法,让我知道,在每次删除时,图形连接是否已被破坏&如果是这样,连接的组件是什么。有没有办法优化图形的空间性质,或者我注定要使用标准的图形处理算法?

我想我需要某种算法,当节点从图中删除时,动态维护图中节点的连接关系。到目前为止,我设法找到的是A *,跳跃点搜索和最短路径算法,我还在这里使用了算法:https://en.wikipedia.org/wiki/Dynamic_connectivity#Decremental_connectivity

注意:我的图表肯定是循环的。

1 个答案:

答案 0 :(得分:0)

好的,所以在考虑了这个之后,我能想出的最佳答案仍然没有利用图的空间约束,但我相信它以摊销成本O(log(n)运行。这是一个草图这个想法:

首先,我们计算图形的任意生成树,从任何节点开始并为树选择任意边。理想情况下,我们希望尽可能保持平衡,即最小化深度。

然后,在每次删除时,我们按如下方式更新生成树:

  • 如果删除的边缘不在生成树中,则不执行任何操作
  • 否则,这是已删除的父子关系,我们注意到子节点
  • 对于这个子节点的所有子节点,我们暂时标记它们,即我们在每个节点上设置一些标记,将其标记为可能从主树中断开的受影响树的一部分

现在我们从子节点开始运行这个递归算法。假设该算法当前正在处理节点n:

  • 如果图表中有n的边缘到图表中的未标记的节点,请使用此边缘更新生成树并返回“true”
  • 对于节点的每个子节点,我们运行递归算法并按以下步骤进行操作
  • 如果算法为任何子节点返回false,则图形被破坏,即断开连接
  • 否则我们可以选择任何节点并在此节点指向我们的节点n并自己返回“true”

如果我们实际上维护了两个单独的生成树,我们可以在后台处理边缘删除并在使用一棵树或另一棵树之间切换,以提高其在实时程序中的使用效率,例如:一场比赛。