有没有办法在常量时间(O(1))中查找有向无环图中是否存在路径?

时间:2014-12-11 17:50:18

标签: algorithm graph graph-algorithm directed-acyclic-graphs

我有一些有向无环图。我想找到O(1)中两个顶点之间是否存在路径。

另外,我想在O(n^2)中添加和删除两个顶点之间的边。

我认为,我需要存储信息,两个节点之间存在多少路径。但我没有提出完整的算法。

2 个答案:

答案 0 :(得分:2)

我们假设f(i, j)是从ij顶点的路径数。最初(我假设图表为空,如果不是这种情况,则可以使用添加操作添加所有边缘)f(i, j) = 1如果i = j,则0

要从a添加边缘到b,您可以使用以下过程:

for i = 1 .. n
    for j = 1 .. n
        new_f(i, j) = f(i, j) + f(i, a) * f(b, j) //add the number of paths that contain a new edge

其中n是顶点数。

删除边缘可以用类似的方式完成:

for i = 1 .. n
        for j = 1 .. n
            new_f(i, j) = f(i, j) - f(i, a) * f(b, j) //subtract the number of paths that contian this edge

删除/添加边缘显然需要O(n ^ 2)次。当且仅当a

时,存在从bf(a, b) != 0的路径

但是,此解决方案存在一个问题:路径数量可能非常大(大于标准整数类型可以容纳)并且使用任意精度算法会增加时间复杂度。为了避免这个问题,您可以计算以某个大质数为模的路径数(但小到足以适合标准整数类型)p。此解决方案可能会产生不正确的结果(路径数可以0p,即使它实际上非零),但失败的概率很低。要进一步减少它,您可以计算f模数几个不同的素数。

答案 1 :(得分:-2)

阅读此内容的好地方是“算法,第4版”。罗伯特塞奇威克和凯文韦恩。http://algs4.cs.princeton.edu/home/。他们还在Coursera.org上展示了“算法”课程。这是免费的,那里有材料来回答你的问题。看看。https://www.coursera.org/course/algs4partI