关于算法:有限小数的有向无环图中的最短路径

Shortest path in Directed Acyclic Graph with small degree

n顶点上给出一个加权有向无环图,使每个顶点在至多5处不一致,在至多5处不一致。节点0, 1, ..., n - 1的方向如下

江户十一〔四〕号

埃多克斯1〔5〕

埃多克斯1〔6〕

江户十一〔七〕号

埃多克斯1〔8〕

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

我们将得到q查询,询问从uv的最短路径长度。这里,n可以达到10^5q可以达到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->V的25种可能性

编辑

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