一 |
:求解最短路径的Dijkstra算法
二:Dijkstra算法伪代码
Vs(iN,2): Vs(iN,1)==1表示顶点iN在集合Vs,Vs(iN,2)存储到iN最短距离。
Ay(NN,NN): 领接矩阵存储边权。 不可行的路记为无穷大。
By(NN,NN): 记录到顶点iN最短路径的前一个顶点。
Minp=0; jn=0;
while (Vs(NN,1)==1) %顶点jN表示末点。
for (iN=1:NN)
if (Vs(iN,1)==1)%从在集合Vs顶点中找出到外顶点的最短路。
子函数:找出顶点iN 到外的最短路长与 顶点号[minp2,jN];
If Minp >minp2
Minp=minp2;
毁掉前记录,从新记录顶点jN与iNN;
End
If Minp==minp2
Minp=minp2;
记录顶点jN与iNN;
End
End
End
%上For循环结束,表找最短路 向前推进一次。
%记录上面寻找的最短路。
修改By(jN,iNN)=1; 表示iNN为到jN前一个顶点
修改Vs(jN,:) ;
End
子函数:找出顶点iN 到外的最短路长与 顶点号[minp2,jN];
Function [jN, Minp2 ]=Minp(AyI, Vs )
Minp2=Inf ;
For tN=1:length(AyI)
If Minp2 >AyI( tN )&&Vs(tN,1)==0
Minp2=AyI(tN);
jN=tN;
End
End
三:代码
function f=MinPath() %记所求起点为0,终点NN
[NN,Ay]=InitGraph();
By=zeros(NN);
Vs=zeros(NN,2);
Vs(1,1)=1; %起点放入集合Vs
JiLuQian=zeros(1,NN); is=1; %记录前一顶点
while Vs(NN,1)~=1 %结束顶点
Minp=inf; jN0=0;
for iN=1:NN
if Vs(iN,1)==1
[Minp2,jN]=Minpa(Ay(iN,:),Vs);
Minp2=Minp2+Vs(iN,2);
%寻之后,jN一个;而它前一个顶点可能有多个
if Minp>Minp2
Minp=Minp2; jN0=jN;
is=1; JiLuQian(1,is)=iN; continue ;
end
if Minp ==Minp2&jN0==jN;
%排除同时多条路径相等,但到达顶点不相同
is=is+1; JiLuQian(1,is)=iN;
end
end
end
if Minp>=inf
disp(‘不能找到通路到所求顶点!’);
break;
end
Vs(jN0,:)=[1,Minp];
isl=1;
while isl<=is
By(jN0,JiLuQian(1,isl))=1 ;
isl=isl+1;
end
end
%回搜By找最短路径输出
Search( By, NN, NN);
f=Vs(NN,2);
end
% 顶点到外的最小路经
function [Minp2,jN]=Minpa(AyI,Vs)
Minp2=inf;
jN=[];
for tN=1:length(AyI)
if Minp2 >AyI(tN) & Vs(tN,1)==0 %找一顶点到外的最小路经
Minp2=AyI(tN);
jN=tN;
end
end
end
% 回寻输出最短路径
function tp=Search( By, NN,jv)
tp=1;
if jv==1
return;
end
it=1;
while it<NN
if By(jv,it)~=0
Search( By, NN, it);
fprintf(1,’%d–>’,it);
if jv==NN
fprintf(1,’%d\n’,NN);
end
end
it=it+1;
end
end
% 建立图形
function [NN,Ay]=InitGraph()
%顶点列:1 2 3 4 5 %顶点行
Ay= [ Inf 1 2 Inf Inf % 1
Inf Inf Inf 3 5 % 2
Inf 4 3 Inf Inf % 3
Inf Inf Inf Inf 2 % 4
Inf Inf Inf Inf Inf % 5
]
NN= 5 ; %表示领接矩阵的行列数,即图的顶点数
% 建立图的领接链表
%NN= input(‘请输入顶点数:’);
%Ay=zeros(NN); Ay(:,:)=inf;
%disp(‘输入弧的起点,终点,权值(输入都为0结束)!’);
%v0=input(‘v0= ‘);v1=input(‘v1= ‘);dis=input(‘dis= ‘);
%while v0~=0|v1~=0|dis~=0
% Ay(v0,v1)=dis;
% v0=input(‘v0= ‘);v1=input(‘v1= ‘);dis=input(‘dis= ‘);
%end
% 建立图的领接链表
end