检查图形是否已断开连接的有效方法?
Efficient way to check whether a graph has become disconnected?
使用disjoint set forest, we can efficiently check incrementally whether a graph has become connected while adding edges to it. (Or rather, it allows us to check whether two vertices already belong to the same connected component.) This is useful, for example, in Kruskal's algorithm计算最小生成树。
是否有类似有效的数据结构和算法来检查图是否在删除边时断开连接?
更正式地说,我有一个连通图 G = (V, E)
,我从中迭代地一条一条地删除边。不失一般性,假设这些是 e_1
、e_2
,等等。我想在 G
断开连接之前停止,所以我需要一种方法来检查删除 e_i
是否会使图形断开连接。这当然可以通过删除 e_i
然后从任意顶点进行广度优先或深度优先搜索来完成,但这是一个 O(|E|)
操作,使得整个算法 O(|E|²)
.我希望通过某种方式利用上一次迭代的结果有一种更快的方法。
我看过 partition refinement 但它并没有完全解决这个问题。
有一系列数据结构旨在支持“在两个节点之间添加一条边”、“删除两个节点之间的一条边”和“是否存在从节点 x 到节点 y 的路径”形式的查询?这称为动态连接问题,您可以使用许多数据结构来解决它。不幸的是,这些数据结构往往比 disjoint-set 森林复杂得多,因此您可能需要四处搜索,看看是否可以在某处找到 ready-made 实现。
Holm 等人的分层森林结构的工作原理是维护图形的生成森林层次结构,并对边进行一些巧妙的簿记,以避免在查看图形的两个部分是否仍然链接时重新扫描它们。它支持在摊销时间 O(log2 n) 内添加和删除边,以及“这两个节点是否连接?”形式的查询。在时间 O(log n / log log n).
Kapron 等人开发了一种称为随机切割集的最新随机结构。所有三个操作 (IIRC) 的成本为 worst-case O(log5 n)。
可能有更好的方法来解决您的特定问题,不需要这些重量级方法,但我想我会提到这些以防它们有用。
使用disjoint set forest, we can efficiently check incrementally whether a graph has become connected while adding edges to it. (Or rather, it allows us to check whether two vertices already belong to the same connected component.) This is useful, for example, in Kruskal's algorithm计算最小生成树。
是否有类似有效的数据结构和算法来检查图是否在删除边时断开连接?
更正式地说,我有一个连通图 G = (V, E)
,我从中迭代地一条一条地删除边。不失一般性,假设这些是 e_1
、e_2
,等等。我想在 G
断开连接之前停止,所以我需要一种方法来检查删除 e_i
是否会使图形断开连接。这当然可以通过删除 e_i
然后从任意顶点进行广度优先或深度优先搜索来完成,但这是一个 O(|E|)
操作,使得整个算法 O(|E|²)
.我希望通过某种方式利用上一次迭代的结果有一种更快的方法。
我看过 partition refinement 但它并没有完全解决这个问题。
有一系列数据结构旨在支持“在两个节点之间添加一条边”、“删除两个节点之间的一条边”和“是否存在从节点 x 到节点 y 的路径”形式的查询?这称为动态连接问题,您可以使用许多数据结构来解决它。不幸的是,这些数据结构往往比 disjoint-set 森林复杂得多,因此您可能需要四处搜索,看看是否可以在某处找到 ready-made 实现。
Holm 等人的分层森林结构的工作原理是维护图形的生成森林层次结构,并对边进行一些巧妙的簿记,以避免在查看图形的两个部分是否仍然链接时重新扫描它们。它支持在摊销时间 O(log2 n) 内添加和删除边,以及“这两个节点是否连接?”形式的查询。在时间 O(log n / log log n).
Kapron 等人开发了一种称为随机切割集的最新随机结构。所有三个操作 (IIRC) 的成本为 worst-case O(log5 n)。
可能有更好的方法来解决您的特定问题,不需要这些重量级方法,但我想我会提到这些以防它们有用。