Bellman-Ford(贝尔曼-福特算法)算法
Bellman-Ford算法,对给定的带权图G=(V,E),其源点为s,加权函数w是边集E的映射。对图G运行Bellman-Ford算法的结果是一个布尔值,表明图中是否存在着一个从源点s可达的负权回路。若不存在这样的回路,算法将给出从源点s到图G的任意顶点v的最短路径D。算法代码如下:function Bellman_Ford(d,n,s)
%d为已知图的邻接矩阵,n为顶点数(各顶点标号为1,2,...,n),s为源点标号
for i=1:n %初始化dist,pre
dist(i)=inf; %dist(i)为s,i之间的最短路的长度
pre(i)=NaN; %pre(i)为s到i的最短路上i的前一个顶点
end
dist(s)=0;
for k=1:n-1
for i=1:n %松弛操作
for j=1:n
if d(i,j)~=inf
if dist(j)>dist(i)+d(i,j)
dist(j)=dist(i)+d(i,j);
pre(j)=i;
end
end
end
end
end
for i=1:n
for j=1:n
if d(i,j)~=inf
if dist(i)+d(i,j)<dist(j)%判断有无负权回路
error('Negetive WeightCircut');
end
end
end
end
dist
pre
end
%%%%%%%
运行如下代码:
clc;clear
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;...
8 6 7 0 5 1 2 inf;inf 1 inf 5 0 3 inf 9;inf inf inf 1 3 0 4 6;...
inf inf 9 2 inf 4 0 3;inf inf inf inf 9 6 3 0]
i=1;m=8;
Bellman_Ford(w,m,i)
%%%%%%%
所得结果:
dist =
0 -2 1 3 -1 2 5 8
pre =
NaN 1 1 6 2 5 4 5
结果有负数,不知是不是最优结果。求大神帮忙!!!谢谢大神!
代码copy自百度百科。 {:3_41:}{:3_41:}{:3_41:}{:3_41:} {:3_42:}路过…… {:3_41:}{:3_41:},额 我还以为是写好的东西,拿出来分享呢 我也来了,哈,看一看 你这权值就有负的啊!
页:
[1]