Floyd算法求最短路问题

Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。

优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。

给出两个通用的程序

  • 程序1
%floyd算法通用程序,输入a为赋权邻接矩阵
%输出为距离矩阵D,和最短路径矩阵path
clc
clear
a=[Inf,Inf,10,Inf,30,100;Inf,Inf,5,Inf,Inf,Inf;Inf,Inf,Inf,50,Inf,Inf;Inf,Inf,Inf,Inf,Inf,10;Inf,Inf,Inf,20,Inf,60;Inf,Inf,Inf,Inf,Inf,Inf];%邻接矩阵
s=1;
t=6;%这里设置哪到哪的最短路

n=size(a,1);
D=a;
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
%% 配合floyd算法的后续程序,s为源点,t为宿点
%L为长度,R为路由
%若出现提示形如“试图访问 D(0,2);索引必须为正整数或逻辑值”提示说明不存在最短路


L=zeros(0,0);
R=s;
while 1
    if s==t
        L=fliplr(L);
        L=[0,L];
        return
    end
    if D(s,t)==Inf 
        L=Inf;break;
    else 
    L=[L,D(s,t)];
    R=[R,path(s,t)];
    s=path(s,t);

    end
end
a;%a为输入的邻接矩阵
D;%输出两点间的最短路长
path;%输出路由矩阵,即最短路径矩阵,虽然我也不懂是啥
L=L(length(L))%L的最后一位即为s到t的最短路长   key
R%这里输出最短路的路径   key
  • 程序2
clear;
clc;
n=6; 
a=zeros(n);
a(1,2)=50;
a(1,4)=40;
a(1,5)=25;
a(1,6)=10; 
a(2,3)=15;
a(2,4)=20;
a(2,6)=25;
a(3,4)=10;
a(3,5)=20; 
a(4,5)=10;
a(4,6)=25; 
a(5,6)=55;
a=a+a';
M=max(max(a))*n^2; 
%M为充分大的正实数 
a=a+((a==0)-eye(n))*M;
path=zeros(n); 
for k=1:n    
    for i=1:n       
        for j=1:n          
            if a(i,j)>a(i,k)+a(k,j)
                a(i,j)=a(i,k)+a(k,j); 
                path(i,j)=k;         
            end
        end
    end
end
a, path
  • 另外,求一个城市到另一个城市的最短路还可以用如下方法:
%求第一个城市到其它城市的短路径的 Matlab 程序如下:
clc,clear
a=zeros(6); 
a(1,2)=50;
a(1,4)=40;
a(1,5)=25;
a(1,6)=10; 
a(2,3)=15;
a(2,4)=20;
a(2,6)=25; 
a(3,4)=10;
a(3,5)=20; 
a(4,5)=10;
a(4,6)=25;
a(5,6)=55;
a=a+a'; 
a(find(a==0))=inf;
pb(1:length(a))=0;
pb(1)=1;index1=1;
index2=ones(1,length(a)); 
d(1:length(a))=inf;
d(1)=0;temp=1; 
while sum(pb)<length(a)   
    tb=find(pb==0);    
    d(tb)=min(d(tb),d(temp)+a(temp,tb));
    tmpb=find(d(tb)==min(d(tb)));   
    temp=tb(tmpb(1));   
    pb(temp)=1;    
    index1=[index1,temp];  
    temp2=find(d(index1)==d(temp)-a(temp,index1));
    index2(temp)=index1(temp2(1)); 
end
d, index1, index2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值