Floyd算法求最短路问题
来源:互联网 发布:c语言输出整数 编辑:程序博客网 时间:2024/06/05 04:32
Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。
给出两个通用的程序
- 程序1
%floyd算法通用程序,输入a为赋权邻接矩阵%输出为距离矩阵D,和最短路径矩阵pathclccleara=[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 endendfor 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 endend%% 配合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); endenda;%a为输入的邻接矩阵D;%输出两点间的最短路长path;%输出路由矩阵,即最短路径矩阵,虽然我也不懂是啥L=L(length(L))%L的最后一位即为s到t的最短路长 keyR%这里输出最短路的路径 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 endenda, path
- 另外,求一个城市到另一个城市的最短路还可以用如下方法:
%求第一个城市到其它城市的短路径的 Matlab 程序如下:clc,cleara=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)); endd, index1, index2
0 0
- Floyd算法求最短路问题
- floyd算法求最短路
- hdu1690Bus System(Floyd 算法求最短路)
- MATLAB Floyd算法求最短路
- poj 1125 floyd算法求最短路
- 最短路问题 Dj && Floyd 算法
- 最短路-Floyd算法
- 最短路算法(Floyd)
- 最短路-Floyd算法
- 最短路 Floyd算法
- Floyd最短路算法
- 最短路-Floyd算法
- Floyd最短路算法
- 最短路:Floyd算法
- Floyd最短路算法
- 最短路-Floyd算法
- Floyd最短路算法
- Floyd最短路算法
- 【大型网站技术架构笔记】(三)高性能与高可用架构
- 关于Java运行外部程序时的Process和Runtime类
- PullToRrefresh自定义下拉刷新动画
- 【大型网站技术架构笔记】(四)伸缩性、可扩展性与安全
- Python字符串的encode与decode研究心得乱码问题解决方法
- Floyd算法求最短路问题
- 分布式锁的三种实现方式
- 一致性哈希原理与实现
- kidd风的IOS日志之触摸事件,手势识别,摇晃事件的详解
- spring-data-redis中的坑和误区
- DEA(数据包络分析)程序模板
- 为你的Android应用定制属于你的BaseActivity http://blog.csdn.net/jiahui524
- JVM学习笔记
- 将二叉树拆成链表 Flatten Binary Tree to Linked List