Dijkstra算法是一种求解两点之间最短路径的算法,尽管求解的是特定两个端点的最短路径,但实际上该算法遍历了这两点“之间”的节点,即求出了起点到终点的最短路径后,也能求得起点到与终点之间节点的距离。故求解的数据量过大时,该算法可能速度稍慢,话不多说,直接上代码,这是我学习参考“七月是你的谎言”的文章《matlab实现dijkstra算法(.m文件可直接运行)》码出的,发现其代码稍微有点小瑕疵导致不能输出满意的结果,稍作改进,能够输出正确的结果。
clc,clear
%Dijkstra算法
tic
A=zeros(6);
A(1,2)=1;A(1,3)=2;
A(2,4)=6;A(2,5)=5;
A(3,4)=4;A(3,5)=3;
A(4,6)=7;
A(5,6)=8;
A(A==0)=inf;
%先求最短路径值
begin=1;%起点序号为1
ending=4;%终点序号为6
U=1:length(A);%未求出最短径路的集合
S=begin;%标记点集合S
U(U==begin)=[];%未标记点集合
next=ones(length(A),1)*(-1);%保证未相连的下一节点为负数
for j=1:size(A)
if A(begin,j)~=inf;
next(j)=begin;
end
end
dis=A(begin,:);%起点到各点的距离
minpath=0;%此时起点到各点的最短路为0
%开始计算最短径路的值
while length(S)<length(A)%没遍历完时
mindis=min(dis(U));%找出与起点相连长度最短的那个点
if mindis==inf
disp('未完成');
break
end
minpath=mindis;
[~,index]=find(dis==mindis,1);%找到与其相连最短的点的编号
S=[S,index];%加入已标记集合S
U(U==index)=[];%在U中删去index
if index==ending%保证到最终点结束
disp('已完成');
break;
end
%更新径路长度
for k=1:length(U)
if (minpath+A(index,U(k)))<dis(U(k))
dis(U(k))=minpath+A(index,U(k));
next(U(k))=index;
end
end
end
disp('最短径路长度为:');
disp(dis(ending));
%找出最短路
Path=0;
while ending~=begin
str=[num2str(next(ending)),'到',num2str(ending)];
disp(str);
if next(ending)<0
disp('找不到合适的路径');
end
Path=A(next(ending),ending)+Path;
ending=next(ending);
end
toc
输出的结果如图所示: