Shortest path in Directed Acyclic Graph with small degree
在n顶点上给出一个加权有向无环图,使每个顶点在至多5处不一致,在至多5处不一致。节点0, 1, ..., n - 1的方向如下
江户十一〔四〕号
埃多克斯1〔5〕
埃多克斯1〔6〕
江户十一〔七〕号
埃多克斯1〔8〕
边缘只能从一行中的某个节点到下一行中的某个节点。
我们将得到q查询,询问从u到v的最短路径长度。这里,n可以达到10^5,q可以达到10^4。权重都是正整数。
我们能比O(nq)动态编程做得更好吗(显然在这里不起作用)?
- 请更具体地介绍图形布局。每行是否由5个节点组成,这意味着n是5的倍数?
- 是的,除了最后一行外,每行由5个节点组成。该行包含剩余的<=5个节点。
- 为什么动态编程的复杂性时间是O(n^2)?我认为这是O(e)和e图的边数。就像每个节点最多只能有5边一样,复杂性将是O(5n) = O(n)。
- 每个查询都是O(n),所以实际上是O(nq)。对不起的。
- 如果图形是定向的,并且边只能从一行到下一行,而不能是前一行。您不需要确定是否连接了两个节点吗?然后距离为地板(V/5)-地板(U/5)。
- 图是加权的。
- 我的错,我读得快,对不起。
- 然后每个查询都有线性时间,这非常好。为什么你认为你能做得更好?如果你有任何猜测,告诉我们
- 使用theta(n)查询的每个查询的线性时间实际上比O(n^2)预处理(以获取所有最短路径),然后是O(1)查询的时间差。
这似乎太好了,不可能是真的,对不起,如果不是…您可以得到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)的查询的总的复杂度。
- 也许你仍然可以通过递归地应用这个方法来改进它。
- 用o(n^2)计算所有最短距离:只需按通常的顺序迭代图。在每个节点上,存储与前一个节点的距离。当您到达一个新的节点x时,对于前面的其他节点,只需比较x的5个可能的前辈给出的5个可能性。每x等于0(n),共等于0(n^2)。
- 这是一个很好的解决方案-只是为了确保不混淆实际的复杂性,而不是O(n^4/3),也许您应该像O(n^(4/3))那样编写它。