单个源顶点的最轻路径数

时间:2015-05-12 20:08:53

标签: algorithm graph-theory graph-algorithm bellman-ford

假设我有一个带有正或负权重的定向加权图(没有零或负加权循环)。 该图是Bellman-Ford分析的,意味着每个顶点保存从源顶点到它的最轻路径的数据,以及它在最轻路径中的前身。 存储从源到每个顶点的不同最短路径数量的最有效方法是什么? 如果可能的话,我愿意在线性时间 - O(V + E)。

1 个答案:

答案 0 :(得分:0)

如果没有负边,你可以非常有效地完成它。

将节点v的最短路径表示为D(v)

按距离对顶点进行排序 - O(VlogV)

表示P(v) - 从源到v的路径数。
现在,您可以使用DP来解决这种关系(从头到尾):

P(source) = 1
P(v) = sum { P(u) | (u,v) is an edge and D(u) + w(u,v) = D(v) }

算法的复杂性为O(VlogV + E)

正确性证明:通过归纳(指南):
源的Base子句,有一条路径(空路径)。 我们假设P(v)对于每个v是正确的,D(v) < D(u)

对于以u结尾的每条最短路径,它必须经过其中一个顶点D(v) < D(u)。给定最短路径source->...->v->u,路径将计入P(v)。此外,它不计入任何其他P(v'),因此在sum { P(u) | (u,v) is an edge and D(u) + w(u,v) = D(v) }中只计算一次。
另外,对于任何非最短路径的路径,从归纳假设来看,它不计入v D(v)<D(u),因此必须在最后一步生成路径,但限制(u,v) is an edge and D(u) + w(u,v) = D(v)阻止它,所以我们不计算任何非最短路径。
QED