算法 – 小程度有向无环图中的最短路径

给定n个顶点上的加权有向非循环图,使得每个顶点具有最多5的indegree和最多5的outdegree.节点0,1,…,n-1的方向如下所示

0 1 2 3 4

5 6 7 8 9

10 11 12 13 14

n-5 n-4 n-3 n-2 n-1

边缘只能从一行中的节点到下一行中的某个节点.

我们将给出q个查询,询问从u到v的最短路径长度.这里n可以高达10 ^ 5,q高达10 ^ 4.权重都是正整数.

我们能否做得比O(nq)动态编程更好(这显然不适用于此)?

最佳答案 这似乎太好了,不好意思,如果它不是……你可以得到O(n)(编辑:O(n ^(4/3)))预处理和O(1)查询.

我在考虑你知道如何在时间O(n ^ 2)中计算图中所有节点之间的所有最短距离. (这确实可能,你似乎知道)

将图形划分为k个块,每个块包含n /(5 * k)行. (块应该在完整的行上开始和结束,并且两个连续的行在它们各自的第一行和最后一行上重叠)

计算每个块中所有节点(特别是第一行和最后一行)之间的最短路径:O((n / k)^ 2).

然后,您可以考虑仅包含两个块之间边界处的节点的简化图,其边值等于它们刚刚计算出的最短路径.此简化图的大小为O(k).
在时间O(k ^ 2)中计算该图中的所有最短路径.

总预处理时间:O((n / k)^ 2 k ^ 2).取k = sqrt(n),得到O(n)预处理.

然后查询时间是O(1):取u块结束处的5个节点,v块开始处的5个节点(如果块不同),你只需要比较u->的25种可能性. v

编辑

当然这是假的.实际上你有k块用于计算最短路径,因此该步骤的总复杂度为O(k *(n / k)^ 2).所以总数是O(n ^ 2 / kk ^ 2),k的最佳选择是k = n ^(2/3),这给出了O(n ^(4/3))预处理的总复杂度和总查询O(q)

点赞