对于无向连通图,如何创建去除边后维护的桥的索引?

创建索引本身与计算桥列表相同。问题是如何在删除一条边后保持该索引而不完全重新计算它。

也许存储所有(简单)循环的列表并删除所有需要该边缘(索引维护)的循环将与“此边缘是否在循环中”一起工作以检查其必要性。对于更大的图,最初的计算会非常昂贵,因为循环的数量会随着连接程度呈指数增长。

编辑:给出概率答案的算法也可能有效

附言以下是术语

对于无向连通图,如何创建去除边后维护的桥的索引?

的“算法简介”的摘录
haihaome1 回答:对于无向连通图,如何创建去除边后维护的桥的索引?

在移除边后重新计算桥列表时减少工作量的一种方法是构建一个无桥组件列表以及桥列表(其中无桥组件意味着最大连接子图没有任何桥梁 - 在图片 bcc 组件“2 + 3”将形成一个这样的无桥梁组件 - 因为它们没有任何桥梁,只有一个关节点)。图中的桥总是连接 2 个这样的无桥组件。此外,如果您将每个无桥组件的所有点合并为一个点,您最终会得到一个图形,该图形每个原始图形的桥只有一条边,并保证没有循环(否则可以移除桥并且图形将保持连接) .所以例如对于图片上的图表,您可以按以下方式查看:

 Component1 - Components 2+3 - Component 4 - Component 6
                    |                         /        \     
               One-point                Component 5    One-point

现在有了这样的表示,更新桥列表的算法将需要查看被删除的边并执行如下操作:

  1. 如果删除的边是桥之一 - 图不再连接。
  2. 否则被删除的边属于双连接的每条边之一,即桥仍然是桥+可能会出现新的桥。可以保证新的桥可能只出现在被删除的边所属的组件中——所以我们可以只为那个子图重建桥列表,如果那里有桥,就把图分成无桥组件

在图片上的示例中 - 例如删除了组件 4 中的边。在这种情况下,我们只需要查看组件 4 本身,确定现在所有 3 个左边缘都是桥,并将它们添加到具有三个“单点”组件(尽管一个 -点组件实际上并不需要用于此目的,因为它们不包含任何边)。

在这种情况下,我们总是只需要为删除边的无桥组件重建桥列表。不幸的是,如果您的原始图没有桥(即它是一个大型的无桥组件),这对您并没有多大帮助,尽管您可能会争辩说“没有桥”的起点也不包含很多信息.

我不认为这是您能做的最好的,但它确实回答了您的问题“在删除边缘后保持该索引而不完全重新计算它”的程度,您只需要在之后检查一个无桥组件每个边缘去除。

对于从头开始构建桥接列表的算法(在流程开始时或当您需要将其应用于一个无桥接组件时),您可以例如使用描述为 here 的算法,该算法在 O(V+E) 时间内有效。

本文链接:https://www.f2er.com/584599.html

大家都在问