标题: Bellman-Ford(贝尔曼-福特算法)算法 [打印本页] 作者: bb556 时间: 2011-11-21 06:19 标题: Bellman-Ford(贝尔曼-福特算法)算法 Bellman-Ford算法,对给定的带权图G=(V,E),其源点为s,加权函数w是边集E的映射。对图G运行Bellman-Ford算法的结果是一个布尔值,表明图中是否存在着一个从源点s可达的负权回路。若不存在这样的回路,算法将给出从源点s到图G的任意顶点v的最短路径D[v]。算法代码如下: v8 a$ {* B( R9 m# q$ b& k4 V. lfunction Bellman_Ford(d,n,s) 1 p8 l. p1 p$ d+ {; n0 `$ }%d为已知图的邻接矩阵,n为顶点数(各顶点标号为1,2,...,n),s为源点标号# ~: c7 `$ \( M
for i=1:n %初始化dist,pre, R+ w/ ?& J1 V+ Z+ X
dist(i)=inf; %dist(i)为s,i之间的最短路的长度& O& U# N! J: ~4 D! e4 F
pre(i)=NaN; %pre(i)为s到i的最短路上i的前一个顶点 : h5 t% k# V5 q) N# g% |- L8 a1 Lend , {5 F% _' t: p& o0 x% {$ Gdist(s)=0;$ x# i0 G7 K5 x
for k=1:n-1 , ^/ b& L, l i3 j/ X* b for i=1:n %松弛操作 ! b+ @9 Z0 z( B7 U for j=1:n6 N" L9 `( u* d- L7 ?% m, q1 e% ?5 X
if d(i,j)~=inf) P& F- ~' W. _, Z
if dist(j)>dist(i)+d(i,j) 0 @& z" I3 Z3 t, U0 Z dist(j)=dist(i)+d(i,j); 1 I# w' L9 h7 t pre(j)=i;" \4 j, s# O2 {# |% V$ }1 \
end. W6 k1 `; a) k$ {5 o( @3 v& X
end+ M; G; |- ]6 X4 ^( t- N* o( J
end + }' d" X# Q% W$ t, I" Y end 5 Q0 [6 H# i' x1 p9 \end 0 H* K/ X9 c$ `! [2 \- ?for i=1:n ) \( P/ [, X3 }4 t. R3 ^ for j=1:n 2 e0 L8 Y. {& j3 J2 |8 Q0 i+ C if d(i,j)~=inf+ s1 a% r3 {: J1 G; x1 v
if dist(i)+d(i,j)<dist(j)%判断有无负权回路) s- E& c4 m% b7 B5 ^/ b( q) m" _# y0 v
error('Negetive WeightCircut'); 0 I4 h, K$ B- F$ c end5 [# Q2 g* L( g+ ~, X' b. \6 A X0 J
end ( M- L( C6 J# y6 R end, ?+ C! r6 d U) m. M5 U
end) ~1 S5 g* o3 r" c' I
dist ( j; W6 M) [$ F& \: p) L& G: Apre+ x% A. f+ O" P
end9 Z/ y& ^+ x: U
%%%%%%% $ q* O" U* R7 S, J! R运行如下代码: ( Z) K! Z5 s9 [( h. ^2 Xclc;clear, S* K( j, |8 m; x
w=[0 -2 1 8 inf inf inf inf;2 0 inf 6 1 inf inf inf;1 inf 0 7 inf inf 9 inf;... U1 h9 L$ i6 I1 Y
8 6 7 0 5 1 2 inf;inf 1 inf 5 0 3 inf 9;inf inf inf 1 3 0 4 6;..." M* w: G% ]8 p; | ?! m. @1 b
inf inf 9 2 inf 4 0 3;inf inf inf inf 9 6 3 0]! s) Q3 P( Q# G
i=1;m=8; . \2 S, I' @1 h, A8 s) k7 e$ L$ q+ H4 i+ R/ [4 @# z/ U3 ]
Bellman_Ford(w,m,i) 7 { F% Y: a6 v) E$ Z! i0 z }%%%%%%% * O3 O3 k( p* x: k所得结果: : W/ n, f/ ?1 x$ t. H# b Z! p6 m: R 7 X# M2 `& ^( o( p2 ^4 ]9 ^' C! j ' D: E( F9 s4 z5 d2 adist = % x! N- U- L) o1 b, Z9 j( B6 A- o5 ?
$ }% [# x6 n, K- v, Q. l: [2 Z
0 -2 1 3 -1 2 5 8 . `8 [/ [9 k* H) a7 M4 y J: m0 a6 C, ?9 o( h; e( @3 k2 S& P
4 f( f& e* a. \8 s7 Y4 p. Y
9 b/ A, }0 N' X, e( `& I& q% [) R- d! o
pre = - H6 g8 C3 r @: E7 q, t 1 y: M C* F0 I) P& e# ]9 n, |9 w2 k5 e
NaN 1 1 6 2 5 4 5+ }( w' y& p& r- y. v4 j8 ^
' N& c6 n& g) |* T