欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求任意两点之间的最短距离的Floyd算法及其MATLAB实现

程序员文章站 2022-04-01 17:27:00
...

算法思想

如果中转点为K
当D(i,K)+D(K,j)<D(i,j)
则D(i,j)=D(i,K)+D(K,j)
否则不变

程序的参数说明

P为最短路,顶点以经过次序排序
u为最短距离
W为距离矩阵
k1为起始点
k2为终止点

MATLAB实现

function [P, u] = Floyd(W,k1,k2)
n = length(W);
m = 1;
U = W;
while m <= n
    for i = 1 : n
        for j = 1 : n
            if U(i,j) > U(i,m) + U(m,j);
                U(i,j) = U(i,m) + U(m,j);
            end
        end
    end
    m = m + 1;
end
u = U(k1,k2);

P1 = zeros(1,n);
k = 1;
P1(k) = k2;
V = ones(1,n)*inf;
kk = k2;
while kk ~= k1
    for i = 1 : n
        V(1,i) = U(k1,kk) - W(i,kk);
        if V(1,i) == U(k1,i)
            P1(k+1) = i;
            kk = i;
            k = k + 1;
        end
    end
end
k = 1;
wrow = find(P1 ~= 0);
for j = length(wrow) : (-1) : 1
    P(k) = P1(wrow(j));
    k = k + 1;
end
P;

测试

测试用例:A=

	[0  2  6  4;
    inf 0 3 inf;
    7 inf 0  1 ;
    5 inf 12 0];

测试结果
P =

 1     2     3

u =

 5