给定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)