正加权有向无环图中的k-边最短路径

Posted

技术标签:

【中文标题】正加权有向无环图中的k-边最短路径【英文标题】:k-Edge Shortest Path in Positive Weighted Directed Acyclic Graph 【发布时间】:2013-03-02 05:27:32 【问题描述】:

我得到一个图,G = (V, E),它是正加权的、有向的和非循环的。我要设计一个在 O(k(m + n)) 中运行的算法,用于报告从 s 到 t 的 k 边最短路径。一条 k 边最短路径定义为一条从 s 到 t 的有 k 条边的路径,并且对于从 s 到 t 的所有路径,该路径的总权重也必须是最小的。

由于不能单独使用 BFS 来查找最短路径(除非权重相等),我认为运行时间意味着使用 BFS 来查找具有 k 个边的路径。让我失望的是 k,因为我认为这意味着执行 BFS k 次。

我可能的想法是从源运行 BFS 以查找所有可能的 k-link 路径。通过跟踪沿途的关卡并在将每个节点添加到队列时存储总路径权重,我可以找到所有可能的 k-link 路径及其权重。显然,如果我遇到具有较低路径权重的较低级别的目的地,则根据定义不存在 k 边最短路径。如果有超过 k 个边的路径总权重较小,那该怎么办?它也不是 O(k(m + n))。任何有用的提示将不胜感激。

【问题讨论】:

Dijkstra 算法? 【参考方案1】:

f[i][j]为从sj的i-link最短路径,最初我们有

f[1][x] = e(s, x);

然后迭代K - 1次,每一轮我们使用f[i][]计算f[i + 1][],可以通过

for each node v:
    f[i + 1][v] = INF;
for each edge e[u][v]:
    f[i + 1][v] = min(f[i + 1][v], f[i][u] + e[u][v]);

因此需要O(k(n + m))

【讨论】:

您还需要跟踪路径本身,而不仅仅是它的成本。需要一个类似的数组 parent[i][j](i:步数,j:目标节点)。在对边 (u,v) 进行迭代时,存储导致最小值 f[i+1][v] 的 u

以上是关于正加权有向无环图中的k-边最短路径的主要内容,如果未能解决你的问题,请参考以下文章

狄克斯拉特算法。 适用于,加权有向无环图,且无负权边,的最短路径计算。

有向无环图的判定及拓扑排序

有向无环图

加权有向无环图的最长路径

使用 BFS/DFS 寻找有向无环图中权重最大的路径

在有向无环图中求最长路径