========================================================
经典dijkstra算法,已知顶点,求其到其他各个点的最短距离和路径。
========================================================
function [d index1 index2]=Dijkstra(W)
%d-最短距离,index1-路径排序(升),index2-指向来源(上一个点,递归可得路径)
M=max(max(W));
pb(1:length(W))=0;
pb(1)=1;
index1=1;
index2=ones(1,length(W));
d(1:length(W))=M;
d(1)=0;
temp=1;
while sum(pb)<length(W)
tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+W(temp,tb));
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb(1));
pb(temp)=1;
index1=[index1,temp];
index=index1(find(d(index1)==d(temp)-W(temp,index1)));
if length(index)>=2
index=index(1);
end
index2(temp)=index;
end
d;
index1;
index2;
========================================================
评:只给出了顶点到其他点的最短距离,路径解不彻底,不能直观表达路径。
========================================================
例:求下图中顶点1到其它点的最短距离。
解:
(1)写权值矩阵
quanzhijuzhen=[ 0 2 8 1 Inf Inf Inf Inf
2 0 6 Inf 1 Inf Inf Inf
8 6 0 7 5 1 2 Inf
1 Inf 7 0 Inf Inf 9 Inf
Inf 1 5 Inf 0 3 Inf 8
Inf Inf 1 Inf 3 0 4 6
Inf Inf 2 9 Inf 4 0 3
Inf Inf Inf Inf 8 6 3 0]
(2)带入程序(格式整理后输出如下)
>> [d index1 index2]=Dijkstra(quanzhijuzhen)
d =
0 2 7 1 3 6 9 11
index1 =
1 4 2 5 6 3 7 8
index2 =
1 1 6 1 2 5 3 5
说明:
d——顶点1到点1-8的最短距离分别为0 2 7 1 3 6 9 11;
index1——到其他点的距离排序,即1最近(0),4次之(1),后依次为2(2),5(3),6(6),3(7),7(9),8(11);
index2——各点的上游编号,例如到点5的路径可这样推算:index2(5)=2,index2(2)=1(已经到顶点,结束),则路径为1—>2—>5.