算法用于求解单源最短路径问题(在图中由起始点到终点的最短路径)。不适用于负权回路问题。
算法模型要求两个顶点的集合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
最终结果: