点击箭头处“蓝色字”,关注我们哦!!

算法

最短路径的算法-Floyd算法

● ○ ●

Shortest Path Algorithm - Floyd Algorithm

● ○ ●

Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法

❉❉❉❉❉❉❉❉❉❉

核心思想

通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。

算法描述

a) 初始化:D[u,v]=A[u,v]b) For k:=1 to n    For i:=1 to n     For j:=1 to n      If D[i,j]>D[i,k]+D[k,j] Then       D[i,j]:=D[i,k]+D[k,j];c) 算法结束:D即为所有点对的最短路径矩阵

算法过程

  • 把图用邻接距阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=空值。

  • 定义一个距阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。

  • 把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。

  • 在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。

比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。

时间复杂度

O(n^3)

优缺点分析

Floyd算法适用于APSP(All Pairs Shortest Paths),稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。优点: 容易理解,可以算出任意两个节点之间的最短距离,代码编写简单;缺点: 时间复杂度比较高,不适合计算大量数据。

算法实现

C语言源代码

#include#define Maxm 501using namespace std;ifstream fin("APSP.in");ofstream fout("APSP.out");int p,q,k,m;int Vertex,Line[Maxm];int Path[Maxm][Maxm],Map[Maxm][Maxm],Dist[Maxm][Maxm];void Root(int p,int q){  if (Path[p][q]>0)  {    Root(p,Path[p][q]);    Root(Path[p][q],q);  }  else   {    Line[k]=q;    k++;  }}int main(){  memset(Path,0,sizeof(Path));  memset(Map,0,sizeof(Map));  memset(Dist,0,sizeof(Dist));  fin >> Vertex;  for(p=1;p<=Vertex;p++)    for(q=1;q<=Vertex;q++)    {      fin >> Map[p][q];      Dist[p][q]=Map[p][q];    }  for(k=1;k<=Vertex;k++)    for(p=1;p<=Vertex;p++)      if (Dist[p][k]>0)    for(q=1;q<=Vertex;q++)      if (Dist[k][q]>0)      {        if (((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q))        {          Dist[p][q]=Dist[p][k]+Dist[k][q];          Path[p][q]=k;        }      }  for(p=1;p<=Vertex;p++)  {    for(q=p+1;q<=Vertex;q++)    {      fout << "\n==========================\n";       fout << "Source:" << p << '\n' << "Target " << q << '\n';       fout << "Distance:" << Dist[p][q] << '\n';      fout << "Path:" << p;      k=2;      Root(p,q);      for(m=2;m<=k-1;m++)        fout << "-->" << Line[m];        fout << '\n';        fout << "==========================\n";    }  }fin.close();fout.close();return 0;}

注解:无法连通的两个点之间距离为0;输入:Sample Input

700 20 50 30 00 00 0020 00 25 00 00 70 0050 25 00 40 25 50 0030 00 40 00 55 00 0000 00 25 55 00 10 7000 70 50 00 10 00 5000 00 00 00 70 50 00

输出:Sample Output

==========================Source:1Target 2Distance:20Path:1-->2====================================================Source:1Target 3Distance:45Path:1-->2-->3====================================================Source:1Target 4Distance:30Path:1-->4====================================================Source:1Target 5Distance:70Path:1-->2-->3-->5====================================================Source:1Target 6Distance:80Path:1-->2-->3-->5-->6====================================================Source:1Target 7Distance:130Path:1-->2-->3-->5-->6-->7====================================================Source:2Target 3Distance:25Path:2-->3====================================================Source:2Target 4Distance:50Path:2-->1-->4====================================================Source:2Target 5Distance:50Path:2-->3-->5====================================================Source:2Target 6Distance:60Path:2-->3-->5-->6====================================================Source:2Target 7Distance:110Path:2-->3-->5-->6-->7====================================================Source:3Target 4Distance:40Path:3-->4====================================================Source:3Target 5Distance:25Path:3-->5====================================================Source:3Target 6Distance:35Path:3-->5-->6====================================================Source:3Target 7Distance:85Path:3-->5-->6-->7====================================================Source:4Target 5Distance:55Path:4-->5====================================================Source:4Target 6Distance:65Path:4-->5-->6====================================================Source:4Target 7Distance:115Path:4-->5-->6-->7====================================================Source:5Target 6Distance:10Path:5-->6====================================================Source:5Target 7Distance:60Path:5-->6-->7====================================================Source:6Target 7Distance:50Path:6-->7==========================

Matlab源代码

function [D,R]=floyd(a)n=size(a,1);D=afor i=1:n   for j=1:n     R(i,j)=j;   endendRfor k=1:n   for i=1:n      for j=1:n         if D(i,k)+D(k,j)            D(i,j)=D(i,k)+D(k,j);            R(i,j)=R(i,k);         end      end   end   k   D   Rend

♡♡♡♡♡♡♡♡♡♡

扫码关注我

一起感悟科学魅力

点分享

点点赞

点在看

floyd算法_最短路径的算法:Floyd算法相关推荐

  1. python 最短路径算法_最短路径python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 最短路径问题(python实现)解决最短路径问题:(如下三种算法)(1)迪杰斯特 ...

  2. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  3. python广度优先算法最短路径_最短路径问题的Dijkstra算法 -python

    最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树>    .该算法常 ...

  4. 标签传播算法_复杂网络社区发现算法汇总

    社区发现 这篇文章汇总了一些常见的社区发现概念和算法,包括 Modularity Q Fast Unfolding(Louvain Algorithm) LPA SLPA KL算法 GN算法 社区: ...

  5. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  6. ios笔试题算法_微软笔试题-Dijkstra算法

    Dijkstra算法是典型的算法.Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临 ...

  7. java常见的hash算法_常见的哈希算法和用途

    写在前面 哈希算法经常会被用到,比如我们Go里面的map,Java的HashMap,目前最流行的缓存Redis都大量用到了哈希算法.它们支持把很多类型的数据进行哈希计算,我们实际使用的时候并不用考虑哈 ...

  8. java 寻路算法_游戏中的寻路算法解析

    游戏角色的自动寻路,已经是游戏中一个历史比较悠久的领域,较为成熟也有很多种实现.这里摘录一句后面所提的参考资料中的描述:"业内AI开发者中有一句话:"寻路已不是问题."我 ...

  9. 最小径集的算法_机器学习的利器——集成算法

    最近在打算法竞赛的时候用到了集成算法,效果还不错,索性就总结了一篇集成算法的文章,希望能帮到正在转行的数据分析师们. 集成算法核心思想 集成算法的核心思想是通过构建并结合多个学习器来完成学习任务,也就 ...

  10. 图像重建算法_基于深度学习图像重建算法(DLIR)对CT图像质量和剂量优化的研究:体模实验...

    编者按:今年Joël Greffier博士等在European Radiology (IF 4.1)上发表了题为<Image quality and dose reduction opportu ...

最新文章

  1. php中文件操作函数,php中常用文件操作函数介绍
  2. php mysql 星级评分_jQuery+PHP星级评分实现方法_jquery
  3. Disjoint Set
  4. 面向新闻媒体的命名实体识别技术
  5. 漫画:什么是一致性哈希
  6. java实验总结_Java实验总结——初学(上)
  7. Global Average Pooling对全连接层的可替代性分析(转)
  8. 如何格式化电脑_内存卡格式化不了怎么办?教你两招
  9. 屏幕录像软件camtasia2022汉化版好用的录屏软件
  10. 【精品】爬取 国家统计局 2020年 省市县乡村 数据
  11. 计算机表格怎么算加减,excel表格数据的加减-excel表格怎么自动计算加减
  12. 文献翻译——基于关联规则挖掘识别的鸡源大肠杆菌共有多重耐药模式(上)
  13. Redis 常见面试题(带答案)110道
  14. python程序实现最大限度突破高德地图爬虫限制,包括.exe文件的编译,提供最大限度爬虫高德地图poi思路
  15. Python教你18个高效编程的方法
  16. matlab怎么复数相位,怎么求复数相位
  17. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)
  18. 嵌入式Linux--U-Boot(三)Boot命令使用
  19. 多种乡村体验游盈利方式,助你撬动上千亿乡村旅游市场!
  20. 全国物流信息网发布台风的来临

热门文章

  1. Servlet 第六课: Session的使用
  2. MVC用非Entity Framework将数据显示于视图(二)
  3. ArcServer for Java 讲座
  4. Java项目-基于SSM实现律师事务所管理平台
  5. matlab学习200316
  6. AOP代理配置pointcut
  7. How to Make a Computer Operating System
  8. 前后端分离业务逻辑常用封装函数(一)
  9. python的with用法(参考)
  10. 【Java面试题】48 GC是什么? 为什么要有GC?