Dijkstra算法的实现

        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

输出的结果如图所示:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值