检查有向非循环图中两个顶点之间是否存在路径 - 查询

时间:2015-08-28 16:09:27

标签: algorithm data-structures graph directed-acyclic-graphs ancestor

这个问题可以在每个查询的O(n + m)中轻松解决,但是这可以通过比O(n²)更好的预处理来更好地回答这些查询吗?

在树中,可以通过预先订购和按顺序轻松完成。我在DAG尝试过类似的东西,但没有任何意义。

我也尝试在DAG问题中将此问题更改为LCA,但在DAG中找到LCA无法快速解决。

准确地说,约束可以说:

n - 顶点数,最多10 ^ 5

m - 边数,最多10 ^ 5

q - 查询数量,最多10 ^ 5

3 个答案:

答案 0 :(得分:0)

有趣的问题。我的直觉说“不”。我没想过。

但是(假设这个问题不是理论问题),对于实用目的,您可以使用Bloom filter

使用Bloom过滤器解决问题的一种可能方法是首先生成图表的K个不同顺序,并为每个顺序存储从该节点到其索引的映射。然后,为了测试从N1到N2的“可达性”,检查(foreach顺序)N1的索引是否小于N2的索引(该检查是O(1))。如果这适用于所有订单,则可以很好地(assuming K is big enough)到达。 (根据您的实际使用情况,偶尔可能会产生这种误报,或者您可以运行可靠的O(N + M)检查)。否则,绝对不是。

答案 1 :(得分:0)

我觉得可能会有以下几种解决方案,但这绝不是一个完整的解决方案。

设S是顶点的子集。对于图中的每个顶点V,考虑集合D_S(V),我定义如下:如果V在S中,则D_S(V)= {V},否则,D_S(V)是{V}与{V}的并集对于V的所有直接后代W的集合D_S(W)(即,它是" V的所有最终后代,但是每当你击中V&#34的元素时停止递归。)问题是:我们可以找到一个集合S,使得S的大小为O(f(N)),并且对于所有V,D_S(V)的大小为O(g(N)),并且其中f和g是渐近次线性的? (例如,我们可以为两者实现sqrt。)

如果我们能找到这个,那么我建议采用以下策略。对于预处理,为S中的每个U创建一个包含最终可从U到达的所有顶点的哈希表。这可以在O(f(N)* M)中实现;这不一定比O(N ^ 2)好,但至少比O(M * Q)好。

现在回答一个问题"是否可以从V?"到达,如果V在S中,这是微不足道的。否则,我们检查V = U,在这种情况下它也是微不足道的。最后,我们将相同的过程应用于V的所有后代,递归地,返回" yes"如果答案是"是"通过上述两种情况中的任何一种情况,但" no"只有当我们找不到U.这个递归需要O(g(N))步。

剩下的问题是如何选择S.我认为如果图表来自某个过程,其中out-degree遵循幂律,那么可以采用具有最高出度的sqrt(N)顶点。但是例如,如果我们在N = 2 * K顶点(i,0)和(i,1)上具有图形,则具有K ^ 2个边缘:从每个(i,0)到每个(j,1);然后没有合适的子集S.但是,可能没有合适S的图表必然具有我们可以利用的均匀度......或者可能不是。我不知道。任何想法,让我知道!

答案 2 :(得分:0)

用于DAG上的可达性查询的任何算法都可以用于通过压缩强连接的组件来回答一般有向图上的此类查询。因此,我认为DAG条件无法降低复杂性。

对于有向图的可达性查询,this paper中提到的索引构造技术在某些情况下可能会有所帮助。