正加权有向无环图中的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]
为从s
到j
的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-边最短路径的主要内容,如果未能解决你的问题,请参考以下文章