Algorithm 在线性时间内从顶点查找最轻路径

Algorithm 在线性时间内从顶点查找最轻路径,algorithm,graph,computer-science,Algorithm,Graph,Computer Science,设G(V,E),一个带加权边的有向图(w:E->R)和V中的R。众所周知,从r到u之间,每个u都有一条最轻的路径(按权重计算),也是一条最短的路径(按边计算)。描述从r到每个u查找最轻路径的算法 所以我想的是简单地从r运行BFS算法,只需做一个简单的更改;当我们到达一个顶点时,我们对从它出来的所有边进行排序,并按边的顺序(从最小到最大)将顶点放入队列中 通过这种方式,我们得到了最短路径图(BFS应该这样做),但我们也更喜欢两条最短路径中最轻的一条 假设我的算法是正确的,问题是它不是最有效的算法,

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

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

通过这种方式,我们得到了最短路径图(BFS应该这样做),但我们也更喜欢两条最短路径中最轻的一条

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


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

以下是BFS的psuedocode:

BFS(G,s)
对于V[G]{s}中的每个顶点u

做颜色[u]基本上,据我所知,我们将得到一些BFS树,其中每个节点都包含最轻路径的
成本
,但最短路径可能不是最轻路径。@对。当然,如果您需要最轻路径本身,只需创建一个
成本\u父项
变量,并在更新最小值时更新它-I完全一样。谢谢你的详细回答!不客气。不过请看更新。
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