在线性时间中从顶点找到最轻的路径

时间:2016-09-14 11:38:28

标签: algorithm graph computer-science

  

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

以下是来自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 

你的问题说明

  

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

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

因此,您可以按如下方式修改它:

  1. 还向每个节点添加c[u] u 的费用),并将所有内容初始化为无穷大。另外,添加{em> u 的“费用父级”cp[u]

  2. 当您在 u 的邻接处遇到 v 节点,并且 v 不是黑色时,请检查是否有成本 u +边缘成本低于 v 的当前成本。如果是这样,请更新 v 的费用,并使其费用为 u