24.1-2 证明推论24.3: 设
G = ( V , E )
是一带权重的源结点为s的有向图,其权重函数为
w : E → R
。假定图G不包含从源节点s可以到达的权重为负值的环路,则对于所有结点
v ∈ V
,存在一条从源结点到结点v的路径当且仅当BELLMAN-FORD算法终止时有
v . d < ∞
。 证明 :
1 。
充分性 如果存在一条从源结点到结点v的路径,那么该路径上所有的结点的d属性都是更新过的并小于
∞
。所以BELLMAN-FORD算法终止时必存在
δ ( s , v ) < ∞
。根据引理24.2知道,
v . d = δ ( s , v ) < ∞
。
2 。
必要性 初始化时,任意结点v,
v . d = ∞
。在BELLMAN-FORD算法执行的过程中,
v . d
是单调减少的,而它的每次更新都发生在
u . d + w ( u , v ) < v . d
时,此时的
v . π = u
。因为
v . d < ∞
,所以v在前驱子图中是有祖先的。 又因为前驱子图是一棵以s为根的树,因此在前驱子图中存在一条
s ⇝ v
路径。而图G又包含前驱子图,因此图G中存在一条源结点到结点v的路径。 24.1-3 问题描述 : 假设给定
G = ( V , E )
是一带权重且没有权重为负值的环路的有向图,对于所有的结点
v ∈ V
,从源结点s到结点v之间的最短路径中,包含边的条数的最大值为m。请对算法BELLMAN-FORD进行简单修改,可以让其在m+1遍松弛操作之后终止,即使m不是事先知道的一个数值。 问题求解 : 在BELLMAN-FORD算法的2-4行执行过程中,如果某一次循环结束时
v . d
的值跟本次循环开始时
v . d
的值相比不发生改变时,此次循环即为第m+1次。对算法修改如下: BELLMAN-FORD(G,w,s)
INITALIZE-SINGLE -SOURCE(G,s)
for i=1 to |G.V|-1
for each v in G.V
save v.d to T
for each edge(u,v) in G.E
RELAX(u,v,w)
for each v in G.V
if v.d != T[].d
goto h
h:for each edge(u,v) in G.E
if v.d>u.d+w(u,v)
return FALSE
return TRUE
24.1-4 问题描述: 修改Bellman-Ford算法,使其对于所有结点v来说,如果从源结点s都结点v的一条路径上存在权重为负值的环路,则将
v . d
的值设置为
− ∞
。 问题求解: 在BELLMAN-FORD(G,w,s)的第5-7行中如果
s ⇝ v
存在权重为负值的环路,将会执行第7行。所以只需把第7行修改为
v . d = − ∞
即可。