最短路问题及算法
两种方法:Dijkstra和Floyd算法
Dijkstra算法-----赋权图中从给定点到其余顶点的最短路
function [min,path]=dijkstra(w,start,terminal)
n=size(w,1); label(start)=0; f(start)=start;
for i=1:n
if i~=start
label(i)=inf;
end
end
s(1)=start; u=start;
while length(s)<n
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end
end
if ins==0
v=i;
if label(v)>(label(u)+w(u,v))
label(v)=(label(u)+w(u,v)); f(v)=u;
end
end
end
v1=0;
k=inf;
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end
end
if ins==0
v=i;
if k>label(v)
k=label(v); v1=v;
end
end
end
s(length(s)+1)=v1;
u=v1;
end
min=label(terminal); path(1)=terminal;
i=1;
while path(i)~=start
path(i+1)=f(path(i));
i=i+1 ;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);
Dijkstra算法程序的使用说明:
调用格式为
[min,path]=dijkstra(w,start,terminal), 其中输入变量w为所求图的带权邻接矩阵,start, terminal分别为路径的起点和终点的号码。返回start到terminal的最短路径path及其长度min.
注意:顶点的编号从1开始连续编号。
Floyd算法:求赋权图中任意两顶点间的最短路.
function [D,path,min1,path1]=floyd(a,start,terminal)
D=a;n=size(D,1);path=zeros(n,n);
for i=1:n
for j=1:n
if D(i,j)~=inf
path(i,j)=j;
end, end, end
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j)<D(i,j)
D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k);
end, end, end,end
if nargin==3
min1=D(start,terminal);
m(1)=start;
i=1;
path1=[ ];
while path(m(i),terminal)~=terminal
k=i+1;
m(k)=path(m(i),terminal);
i=i+1;
end
m(i+1)=terminal;
path1=m;
end
Matlab的图论工具箱
graphshortestpath 求图中任意两对顶点间或某个指定顶点到其他点的最短距离和最短路径,具体用法参见MATLAB中的help帮助
[x,y,z]=graphshortestpath(G,s,t,'directed',DirectedValue,'method', MethodValue)
%x,y,z分别用来存放最短路径的值,标号顶点顺序、标号顶点索引, z可以不用求
% directed是标志图为有向或无向的属性,该图是无向图,对应的属性值为false或0
% method表示用的算法,默认值是Dijkstra
graphallshortestpaths 求图中任意两点间的最短距离
具体用法参见MATLAB中的help帮助
a=graphallshortestpaths (w,'directed', directedvalue)
%a用来存放每两个点之间最短距离矩阵
% directed是标志图为有向或无向的属性,该图是无向图,对应的属性值为false或0
graphallshortestpath 求图中所有顶点对之间的最短距离
graphminspantree 在图中找最小生成树 [Tree, pred]= graphminspantree(G, 'Method', MethodValue, ...) 算法选择:‘Kruskal’; 'Prim' — Default algorithm. 具体见help
Graphpred2path 把前驱顶点序列变成路径的顶点序列