bb556 发表于 2011-11-21 06:19

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自百度百科。

jt202010 发表于 2011-11-22 16:57

{:3_41:}{:3_41:}{:3_41:}{:3_41:}

maruibing 发表于 2011-11-22 21:31

{:3_42:}路过……

782915935 发表于 2011-11-22 22:10

{:3_41:}{:3_41:},额

782915935 发表于 2011-11-25 13:08

我还以为是写好的东西,拿出来分享呢

cmd2.com电影 发表于 2011-11-30 02:25

我也来了,哈,看一看

hdzhangliang 发表于 2011-12-19 22:40

你这权值就有负的啊!
页: [1]
查看完整版本: Bellman-Ford(贝尔曼-福特算法)算法