有向图的不相交集合并集
Disjoint Set Union with directed graph
我理解 DSU 严格使用来自这个堆栈溢出问题的无向图 -
尽管如此,我目前正在处理一个涉及 400000 个查询和最多具有 400000 个节点的图的问题,其中有两种可能的查询:
连接节点a和b(当然是定向的)
如果节点“x”可以从节点 1 到达,则输出“true”。否则,打印“false”。
然而,我最初的直觉是使用 DSU;那显然行不通。有什么建议么?谢谢。
您想要的是一个名为 'incremental reachability' 的问题的数据结构。
有多种方法可以构建这样的数据结构,所有方法都有一些不同的 update/query 时间权衡。实现该目标的一种非常简单的方法是使用邻接表并在每次用户查询节点“x”是否可以从 1 到达时使用 BFS。
这让你更新时间:O(1) 和查询时间:O(m).
一个更复杂的想法是'even-shiloach'树[1],这里高效地维护了一颗BFS树。
总更新时间:O(nm) 查询时间:O(1).
类似算法的实验分析见[2]。
[1] Shimon Even,Yossi Shiloach:一个 On-Line Edge-Deletion 问题。 J.ACM 28(1): 1-4 (1981) https://dl.acm.org/doi/10.1145/322234.322235
[2] 完全动态 Single-Source 实践中的可达性:一项实验研究,Kathrin Hanauer、Monika Henzinger 和 Christian Schulz https://arxiv.org/abs/1905.01216
只要您不必删除连接,并且您只对单一来源的可达性感兴趣,那么您可以很容易地在每个操作的摊销常数时间内完成此操作。
- 维护一组已知可从节点 1 访问的节点。最初这将只包含节点 1。我们将这些节点称为 'marked'。
- 当你连接a->b时,如果a被标记而b没有,则标记所有新可达的节点。这是一个传递闭包操作:
- 将 b 放入队列中。
- 当队列不为空时,删除一个顶点,将其标记为可达,并将其所有未标记的邻居放入队列中。
我理解 DSU 严格使用来自这个堆栈溢出问题的无向图 -
尽管如此,我目前正在处理一个涉及 400000 个查询和最多具有 400000 个节点的图的问题,其中有两种可能的查询:
连接节点a和b(当然是定向的)
如果节点“x”可以从节点 1 到达,则输出“true”。否则,打印“false”。
然而,我最初的直觉是使用 DSU;那显然行不通。有什么建议么?谢谢。
您想要的是一个名为 'incremental reachability' 的问题的数据结构。 有多种方法可以构建这样的数据结构,所有方法都有一些不同的 update/query 时间权衡。实现该目标的一种非常简单的方法是使用邻接表并在每次用户查询节点“x”是否可以从 1 到达时使用 BFS。 这让你更新时间:O(1) 和查询时间:O(m).
一个更复杂的想法是'even-shiloach'树[1],这里高效地维护了一颗BFS树。 总更新时间:O(nm) 查询时间:O(1).
类似算法的实验分析见[2]。
[1] Shimon Even,Yossi Shiloach:一个 On-Line Edge-Deletion 问题。 J.ACM 28(1): 1-4 (1981) https://dl.acm.org/doi/10.1145/322234.322235
[2] 完全动态 Single-Source 实践中的可达性:一项实验研究,Kathrin Hanauer、Monika Henzinger 和 Christian Schulz https://arxiv.org/abs/1905.01216
只要您不必删除连接,并且您只对单一来源的可达性感兴趣,那么您可以很容易地在每个操作的摊销常数时间内完成此操作。
- 维护一组已知可从节点 1 访问的节点。最初这将只包含节点 1。我们将这些节点称为 'marked'。
- 当你连接a->b时,如果a被标记而b没有,则标记所有新可达的节点。这是一个传递闭包操作:
- 将 b 放入队列中。
- 当队列不为空时,删除一个顶点,将其标记为可达,并将其所有未标记的邻居放入队列中。