matlab解决图论问题

最短路问题及算法

两种方法:DijkstraFloyd算法

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)

%xyz分别用来存放最短路径的值,标号顶点顺序、标号顶点索引, z可以不用求

% directed是标志图为有向或无向的属性,该图是无向图,对应的属性值为false0

% method表示用的算法,默认值是Dijkstra

graphallshortestpaths  求图中任意两点间的最短距离

具体用法参见MATLAB中的help帮助

a=graphallshortestpaths (w,'directed', directedvalue)

%a用来存放每两个点之间最短距离矩阵

% directed是标志图为有向或无向的属性,该图是无向图,对应的属性值为false0

graphallshortestpath 求图中所有顶点对之间的最短距离

graphminspantree 在图中找最小生成树 [Tree, pred]= graphminspantree(G, 'Method', MethodValue, ...) 算法选择:‘Kruskal’;  'Prim' — Default algorithm. 具体见help

Graphpred2path 把前驱顶点序列变成路径的顶点序列

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值