最短路径算法[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 为到各点的最短距离