小度有向无环图中的最短路径

Shortest path in Directed Acyclic Graph with small degree

给定 n 个顶点的加权有向无环图,每个顶点的入度至多 5 和出度至多 5。节点 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 个查询,询问从 uv 的最短路径长度。这里 n 可以达到 10^5q 可以达到 10^4。权重都是正整数。

我们能否比 O(nq) 动态规划(显然在这里行不通)做得更好?

这似乎好得令人难以置信,抱歉,如果不是...你可以得到 O(n) (EDIT: O(n^(4/3))) 预处理和 O (1)查询.

我认为您知道如何及时计算图中所有节点之间的所有最短距离 O(n^2)。 (确实有可能,你好像也知道)

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

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

那么你可以考虑只包含两个块之间边界处的节点的缩减图,边值等于它们之间的最短路径,你刚刚 computed.This 缩减图的大小为 O(k)。 及时计算该图中的所有最短路径 O(k^2)

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

那么查询时间为O(1):取u的block末尾的5个节点,v的block开始的5节点(如果block不同),只需要比较25 u->v

的可能性

编辑

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