【发布时间】:2015-05-12 20:08:52
【问题描述】:
假设我有一个带有正或负权重的有向加权图(没有零或负权重循环)。 该图是 Bellman-Ford 分析的,这意味着每个顶点都保存从源顶点到它的最轻路径的数据,以及它在最轻路径中的前身。 存储从源到每个顶点的不同最短路径数量的最有效方法是什么? 如果可能,我愿意在线性时间内完成 - O(V+E)。
【问题讨论】:
标签: algorithm graph-theory graph-algorithm bellman-ford
假设我有一个带有正或负权重的有向加权图(没有零或负权重循环)。 该图是 Bellman-Ford 分析的,这意味着每个顶点都保存从源顶点到它的最轻路径的数据,以及它在最轻路径中的前身。 存储从源到每个顶点的不同最短路径数量的最有效方法是什么? 如果可能,我愿意在线性时间内完成 - O(V+E)。
【问题讨论】:
标签: algorithm graph-theory graph-algorithm bellman-ford
如果你也没有负边缘,你可以非常有效地做到这一点。
将节点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)
正确性证明:通过归纳(指南):
源的基本子句,只有一个路径(空路径)。
让我们假设 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),所以路径必须在最后一步生成,但限制@987654337 @ 正在阻止它,所以我们不计算任何非最短路径。
QED
【讨论】: