我有一些有向无环图。我想找到O(1)
中两个顶点之间是否存在路径。
另外,我想在O(n^2)
中添加和删除两个顶点之间的边。
我认为,我需要存储信息,两个节点之间存在多少路径。但我没有提出完整的算法。
答案 0 :(得分:2)
我们假设f(i, j)
是从i
到j
顶点的路径数。最初(我假设图表为空,如果不是这种情况,则可以使用添加操作添加所有边缘)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
。
b
到f(a, b) != 0
的路径
但是,此解决方案存在一个问题:路径数量可能非常大(大于标准整数类型可以容纳)并且使用任意精度算法会增加时间复杂度。为了避免这个问题,您可以计算以某个大质数为模的路径数(但小到足以适合标准整数类型)p
。此解决方案可能会产生不正确的结果(路径数可以0
模p
,即使它实际上非零),但失败的概率很低。要进一步减少它,您可以计算f
模数几个不同的素数。
答案 1 :(得分:-2)
阅读此内容的好地方是“算法,第4版”。罗伯特塞奇威克和凯文韦恩。http://algs4.cs.princeton.edu/home/。他们还在Coursera.org上展示了“算法”课程。这是免费的,那里有材料来回答你的问题。看看。https://www.coursera.org/course/algs4partI