matlab上实现Dijkstra算法找两点最短路径代码

Dijkstra算法就不多解释了,这个代码我是在论文实验里用到了,主要是用来找两个路由节点之间的最短路径。

代码写的比较随意。。。

function [ans] = djk(adj,start,des)
%% adj 所有节点构成的一个邻接矩阵
%% start 源节点序列号
%% des  目的节点序列号
%% ans  源节点到目的节点的路径长度
U=1:length(adj);        %没有求出的最短路径节点的集合
next=ones(length(adj),1)*-1;
U(find(U==start))=[];
S=start;                %已经求出最短路径的节点集合
dis=adj(start,:);
curdis=0;
lastnodes=ones(1,length(dis));
lastnodes=lastnodes*start;
while length(S)<length(adj)
    mindis=min(dis(U));
    if mindis==inf
        disp('未完成');
        break
    end
    curdis=curdis+mindis;
    [r,index]=find(dis==mindis,1);
    S=[S,index];
    U(find(U==index))=[];
    lastpath=lastnodes(index);
    next(index,1)=lastpath;
    if index==des
        break;
    end
    
    for k=1:length(U)
     if(curdis+adj(index,U(k))<dis(U(k)))
         dis(U(k))=curdis+adj(index,U(k));
         lastnodes(U(k))=index;
     end
    end
end

    ans=0;
   while des~=start
      str=[num2str(next(des)),'->',num2str(des)];
     disp(str);
      if next(des)<0
         disp('找不到合适路径');
         break;
     end
     ans=adj(next(des),des)+ans;
     des=next(des);
   end

简单的测试一下:
邻接矩阵如下:
在这里插入图片描述

a=zeros(14);
a(1,2)=50;a(1,3)=60;
a(2,4)=65;a(2,5)=40;
a(3,4)=52;a(3,7)=45;
a(4,5)=50;a(4,6)=30;a(4,7)=42;
a(5,6)=70;a(6,10)=88;a(10,11)=87;a(11,14)=98;
a=a+a';a(find(a==0))=inf
for i=1:length(a)
    a(i,i)=0;
end

djk(a,1,14)

输出结果:
由节点1 出发 到节点 14
在这里插入图片描述

由节点5出发到节点14
在这里插入图片描述

由节点7 到12
在这里插入图片描述

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值