【问题标题】:Find lightest paths from a vertex in a linear-time在线性时间内从一个顶点找到最轻的路径
【发布时间】:2017-01-22 04:53:22
【问题描述】:

G(V,E),一个带有加权边的有向图(w:E -> R)和一个rV 中。众所周知,对于每个u 都有一条最轻的路径(按权重),这也是一条最短的路径(按边),从ru。描述一种算法来找到从r 到每个u 的最轻路径。

所以我想到的只是简单地从r 运行一个 BFS 算法,并进行简单的更改;当我们到达顶点v 时,我们对从它出来的所有边进行排序,并按边的顺序(从小到大)将顶点放入队列中。

这样我们得到了一张最短路径图(正如 BFS 应该做的那样),但我们也更喜欢两条最短路径中最轻的一条。

假设我的算法是正确的,问题是它不是最有效的算法,因为我们必须对总和为O(|E|lg |E|) 的所有边进行排序。

如何在线性时间内完成 (O(|V|+|E|)?

【问题讨论】:

    标签: algorithm graph computer-science


    【解决方案1】:

    以下是来自Introduction To Algorithms 的 BFS 伪代码:

    BFS(G,s)
    
        for each vertex u in V[G] - {s}
            do color[u] <-- white
                d[u] <-- infinity
                pi[u] <-- nil 
        color[s] <-- gray
        d[s] <-- 0
        pi[s] <-- nil
        Q <-- {s} 
        while Q != empty set
            do u <-- head[Q]
            for each v in Adj[u]
                do if color[v] = white
                    then color[v] <-- gray
                        d[v] <-- d[u] + 1
                        pi[v] <-- u
                        EnQueue(Q,v) DeQueue(Q)
                color[u] <-- black 
    

    您的问题表明

    众所周知,对于每个 u,都有一条从 r 到 u 的最短路径(按权重),这也是一条最短路径(按边)。

    请注意,根据定义,这是递归的。

    因此,您可以进行如下修改:

    1. 也添加到每个节点c[u]u的成本),并将所有初始化为无穷大。另外,添加cp[u]u 的“成本父级”。

    2. 当遇到u邻接的节点v,且v不是黑色时,检查是否成本u + 边的成本低于 v 的当前成本。如果是这样,更新 v 的成本,并使其成本父 u

    【讨论】:

    • 基本上,据我所知,我们最终会得到一些 BFS 树,其中每个节点都包含最轻路径的 cost,但最短路径可能不是最轻路径。
    • @Elimination Right。当然,如果您需要最轻的路径本身,只需创建一个cost_parent 变量,并在最小值更新时更新它 - 完全一样的想法。
    • 感谢阿米的详细解答!
    • @Elimination 不客气。不过请查看更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2011-06-26
    • 2012-04-30
    相关资源
    最近更新 更多