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