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