Dijkstra算法学习笔记

算法用于求解单源最短路径问题(在图中由起始点到终点的最短路径)。不适用于负权回路问题。

算法模型要求两个顶点的集合S和U。其中S用于储存顶点到其他的的最短路径;U用于求储存其余未求解点及当前点到该点的距离。

算法运行过程中,规定两个非直接连接的点直接的距离为无穷。

1.S集中仅有起点。取起点A到与之直接连接的点B,C,D及其距离,将最短距离3及该点C存入S集。去除U集中起点A到C的距离,更新A到其他点的距离。

2.选定下一个点B,比较筛选A到B的距离。将点B及A到B点的距离存入S集。更新U集中的数据。

3选定下一个点D,比较筛选A到D的距离。将点D及点A到D的距离存入S集。更新U集中的数据。

4同上述步骤执行,可得到点A到终点的最短距离,问题求解完成。

说明:

1.对点的执行顺序是由点到起点的路径复杂度决定的。(路径条数)

2.对U集的数据更新,包括对已知最短距离点相关信息的删除和对S集外其余点路径情况的更新。

具体实现:

  用矩阵a[m,n]存放各边权的邻接矩阵,行向量p用来存放P标号信息,index1用来存放顶点顺序,index2用来存放标号顶点索引,d用来存放最短路径。

  其中    

             

  index2(i)存放起点到第i点最短通路中第i点前一点的序号,d(i)存放起点到第i点最短通路的值,求A到其他点的最短通路。

 代码实现:

 clc,clear all
a=zeros(8);
a(1,2)=8;a(1,3)=3;a(1,5)=8;
a(2,4)=6;a(2,8)=7;
a(3,4)=1;a(3,6)=6;
a(4,5)=2;a(4,7)=6;
a(5,7)=3;a(5,8)=2;
a=a+a';
a(find(a==0))=inf
pb(1:length(a))=0;
pb(1)=1;
index1=1;
index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;
temp=1;
while sum(pb)<length(a)
tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+a(temp,tb));
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb(1));
pb(temp)=1;
index1=[index1,temp];
temp2=find(d(index1)==d(temp)-a(temp,index1));
index2(temp)=index1(temp2(1));
end
d,index1,index2

 最终结果:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈中屯屯屯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值