设
G(V,E)
,w:E -> R
中带有加权边(r
)和V
的有向图。众所周知,对于每个u
,最轻的路径(按权重)也是最短路径(通过边缘),从r
到u
。描述一种算法,以找到从r
到每个u
的最轻路径。
所以我想到的只是简单地从r
运行BFS算法;当我们到达顶点v
时,我们对从它出来的所有边进行排序,并按边顺序(从最小到最大)将顶点放入队列。
这样我们得到的是最短路径的图形(如BFS应该做的那样),但我们也更喜欢两条最短路径中最轻的路径。
让我们假设我的算法是正确的,问题是它不是最有效的算法,因为我们必须对总计为O(|E|lg |E|)
的所有边进行排序。
如何在线性时间内完成(O(|V|+|E|
)?
答案 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。
请注意,根据定义,这是递归的。
因此,您可以按如下方式修改它:
还向每个节点添加c[u]
( u 的费用),并将所有内容初始化为无穷大。另外,添加{em> u 的“费用父级”cp[u]
。
当您在 u 的邻接处遇到 v 节点,并且 v 不是黑色时,请检查是否有成本 u +边缘成本低于 v 的当前成本。如果是这样,请更新 v 的费用,并使其费用为 u 。