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 = − ∞ 即可。