我得到一个图表,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))。任何有用的提示将不胜感激。
答案 0 :(得分:3)
让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))
。