最短路径算法[2019.5.25]

题目:

  实现单源最短路经的迪杰斯特拉算法(Dijkstra),以下图为例,求出1到其余地点的最短路径。

  

基本思想:

  以起始点为中心向外层层扩展,直到扩展到终点为止。

Code:

clc
clear
% 作出邻接矩阵
a=zeros(7);
a(1,2)=10;a(1,3)=15;a(1,4)=30;
a(2,5)=45;a(2,7)=60;
a(3,4)=10;a(3,6)=25;
a(4,6)=20;a(4,7)=23;
a(5,7)=29;
a(6,7)=11;
a=a+a'
% 将a=0的数替换为∞
a(find(a==0))=inf
% 当一个点已经求出到原点的最短距离时,其下标i对应的pb(i)赋1
pb(1:length(a))=0;
pb(1)=1;
% 存放存入S集合的顺序
index1=1; 
% 存放起点到第i点最短通路中第i顶点前一顶点的序号
index2=ones(1,length(a));

% d存放由始点到第i点最短通路的值
d(1:length(a))=inf;
d(1)=0;  
% temp表示c1,算c1到其它点的最短路。
temp=1;  
% 看是否所有的点都标记为P标号
while sum(pb)<length(a)  
% 找到标号为0的所有点,即找到还没有存入S的点
tb=find(pb==0); 
% 计算标号为0的点的最短路,或者是从原点直接到这个点,又或者是原点经过r1,间接到达这个点
d(tb)=min(d(tb),d(temp)+a(temp,tb));
% 求d[tb]序列最小值的下标
tmpb=find(d(tb)==min(d(tb)));  
% 可能有多条路径同时到达最小值,却其中一个,temp也从原点变为下一个点
temp=tb(tmpb(1));
% 找到最小路径的表对应的pb(i)=1
pb(temp)=1;
% 存放存入S集合的顺序
index1=[index1,temp];  
temp2=find(d(index1)==d(temp)-a(temp,index1));
% 记录标号索引
index2(temp)=index1(temp2(1)); 
end
d, index1, index2

输出结果

   0    10    15    25    55    40    48   为到各点的最短距离

posted @ 2019-06-14 10:19  cruelty_angel  阅读(401)  评论(0编辑  收藏  举报