【问题标题】:Number of lightest paths from single source vertex来自单个源顶点的最亮路径数
【发布时间】:2015-05-12 20:08:52
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果你也没有负边缘,你可以非常有效地做到这一点。

    将节点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

    【讨论】:

    • 但据我了解,OP 确实有负优势,不是吗?
    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多