任意两点间的最短距离dijkstra算法 %clear %d=[0 9 inf 3 inf;9 0 2 inf 7;inf 2 0 2 4;3 inf 2 0 inf;inf 7 4 inf 0] %算法:当某点被选做新顶点时,则此时的P值为原始起点到此点的最短距离。 function [d,path]=dijkstra(A) % i 为起点,k为终点 P=zeros(length(A)); for i=1:length(A) pb=zeros(length(A));%用来判断是否选过,选过为1,未选为0 k=i; P(i,k)=0; pb(i,k)=1; T=inf*ones(length(A)); e=sum(pb,2); while e(i,1)<length(A) c=find(pb(i,1:length(A))==0);%寻找没考察的点 for x=1:length(c) T(i,c(x))=min(T(i,c(x)),(P(i,k)+A(k,c(x)))); end B=c; if length(c)~=1 %比较选择最小值,及顶点做为新起点 a=T(i,c(1)); b=B(1); for m=2:length(c) if a>T(i,c(m)) a=T(i,c(m)); b=B(m); else continue; end end k=b; P(i,k)=a; pb(i,k)=1; else P(i,c(1))=T(i,c(1)); k=c(1); pb(i,k)=1; end e=sum(pb,2); end end d=P; %路径的表示 for i=1:length(P) for j=1:length(P) path{i,j}=strcat(num2str(i),'-',num2str(j)); end end for i=1:length(P) for j=1:length(P) v(i,j)=j; end end for i=1:length(P) u=P(i,1); w=v(i,1); for j=1:length(P)-1 for n=j+1:length(P) if P(i,j)> (i,n) u=P(i,j) (i,j)=P(i,n) (i,n)=u; w=v(i,j);v(i,j)=v(i,n);v(i,n)=w; else continue end end end end for i=1:length(P) for j=1:length(P) for n=1:j-1 if d(v(i,1),v(i,n))+A(v(i,n),v(i,j))==d(v(i,1),v(i,j)) if v(i,1)~=v(i,n); path{v(i,1),v(i,j)}=strcat(strrep(path{v(i,1),v(i,n)},strcat('-',num2str(v(i,n))),'-'),path{v(i,n),v(i,j)}); else v(i,1)==v(i,n); path{v(i,1),v(i,j)}=path{v(i,n),v(i,j)}; end end end end end % 结果:d = %0 7 5 3 9 %7 0 2 4 6 %5 2 0 2 4 %3 4 2 0 6 %9 6 4 6 0 %path =
% '1-1' '1-4-3-2' '1-4-3' '1-4' '1-4-3-5' %'2-3-4-1' '2-2' '2-3' '2-3-4' '2-3-5' % '3-4-1' '3-2' '3-3' '3-4' '3-5' % '4-1' '4-3-2' '4-3' '4-4' '4-3-5' % '5-3-4-1' '5-3-2' '5-3' '5-3-4' '5-5'
|