Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题。
在Floyd算法中一般有两个矩阵,一个距离矩阵 D D D,一个路由矩阵 R R R,其中距离矩阵用于存储任意两点之间的最短距离,而路由矩阵则记录任意两点之间的最短路径信息。
其思想是:如果可以从一个点进行中转,就进行比较从这个点中转和不中转的距离,存储距离小的情况,并更新距离矩阵和路由矩阵。
从算法思想中我们可以大概推断我们要遍历 n n n个中转点,在每个中转点进行操作的时候,需要对任意两点之间 的距离进行遍历。那么算法就应该有三重循环,第一重循环是遍历中转点,第二重和第三重循环是遍历任意两个点之间的距离。假设中转节点为K,如果: D ( i , k ) + D ( k , j ) < D ( i , j ) D(i,k)+D(k,j)
更多细节请参考:https://blog.csdn.net/kabuto_hui/article/details/82886826
代码如下:
clear;clc;
a = [0 2 6 4;
inf 0 3 inf;
7 inf 0 1 ;
5 inf 12 0];
[d, r] = floyd(a)
disp('--------------------------')
for i = 1:4
for j = 1:4
DisplayPath(r, i, j);
end
end
function [d, r] = floyd(a)
%% 采用floyd算法计算图a中每对顶点最短路
% d是矩离矩阵
% r是路由矩阵
n = size(a, 1);
% 初始化距离矩阵
d = a;
% 初始化路由矩阵
for i = 1:n
for j = 1:n
r(i, j) = j;
end
end
% Floyd算法开始
for k = 1:n
for i = 1:n
for j = 1:n
if d(i, k)+d(k, j)<d(i, j)
d(i, j) = d(i, k)+d(k, j);
r(i, j) = r(i, k);
end
end
end
end
end
function DisplayPath(route, start, dest)
%% 打印出任意两点之间的最短路径
% route : 路由表
% start : 起点index
% dest : 终点index
while 1
if route(start, dest) ~= dest
fprintf('V%s -> ', num2str(start));
start = route(start, dest);
else
fprintf('V%s -> ', num2str(start));
fprintf('V%s\n', num2str(dest));
break;
end
end
end
运行结果如下:
d =
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
r =
1 2 2 4
3 2 3 3
4 4 3 4
1 1 1 4
--------------------------
V1 -> V1
V1 -> V2
V1 -> V2 -> V3
V1 -> V4
V2 -> V3 -> V4 -> V1
V2 -> V2
V2 -> V3
V2 -> V3 -> V4
V3 -> V4 -> V1
V3 -> V4 -> V1 -> V2
V3 -> V3
V3 -> V4
V4 -> V1
V4 -> V1 -> V2
V4 -> V1 -> V2 -> V3
V4 -> V4
[1] kabuto_hui. 最短路径-Floyd算法的matlab实现.md. CSDN博客.