Floyd算法

  • Floyd 的特别之处
  • 算法设计
  • 完整代码
  • 相关题目

之前写了一篇Dijkstra算法详解,那是在趣学算法上的,不过却没在其中找到Floyd,现在这篇文章是啊哈算法里的Floyd算法讲解,同样,书的分享链接在文章末。

Floyd 的特别之处

暑假,小哼准备去一些城市旅游。有些城市有公路,有些城市之间没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之间的最短路程。
上图中有4个城市,8条公路,公路上的数字表示这条公路的长度。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径,这个问题也被称为多源最短路径”问题

算法设计

我们同样用一个二维矩阵来存储信息,如下图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708191237577.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Nzc2NjYy,size_16,color_FFFFFF,t_70#pic_center)    **问题分析**
如何求任意两点间的距离?根据之前的Dijkstra算法中可知,若想让路径最短,可以引入第三个点k,并a->k->b这样才可能缩短路径,并且1~n个点都可以作为这个顶点,那么现在问题就好解决了。
假如现在只允许经过1号顶点,求任意两点间的路程,应该如何求呢?只需要判断e[i][1] +e[1][j] 与e[i][j]的大小即可
e[i][j]表示的是从 i -> j 的距离, e[i][1]+e[1][j]表示的是 i -> 1 -> j的距离。
for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(e[i][j]>e[i][1]+e[1][j])e[i][j]=e[i][1]+e[1][j];//如果距离大于,就把当前这两点距离换成最小的路径}
}
接下来,我们再潘丹如果经过2号顶点是否可以使路径变短,这样就判断了1,2号顶点,如此循环下去,最终的核心代码如下
for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(e[i][j]>e[i][k]+e[k][j])e[i][j]=e[i][k]+e[k][j];
这段代码的基本思想就是:最开始只允许经过1号顶点进行中转,接下来允许经过2号........允许经过n号顶点,求任意两点间的最短路径。
用一句话概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。

完整代码

#include<bits/stdc++.h>
using namespace std;
int main() {int e[10][10], n, m;int INF = 1e9;cin >> n >> m;   //城市个数和公路条数//初始化for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i == j)e[i][j] = 0;else e[i][j] = INF;}}//读入边int t1, t2, t3;for (int i = 1; i <= m; i++) {cin >> t1 >> t2 >> t3;e[t1][t2] = t3;}for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (e[i][j] > e[i][k] + e[k][j])e[i][j] = e[i][k] + e[k][j];for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << e[i][j] << " ";}cout << endl;}return 0;
}/*
输入
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12输出
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0*/

好了,就写到这里,我没有把书上的全部照搬下来,Floyd还是比Dijlstra好理解,但时间复杂度有点高O(N^3)。
同样后期还会写几篇关于Floyd算法的题解,这里是啊哈算法的分享链接:
链接:https://pan.baidu.com/s/1l2ZXfSL3JXtS0seqIpQH2w
提取码:a3pg

相关题目

信息学T1342 最短路径问题

只有5行的算法——Floyd算法相关推荐

  1. 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1

    文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...

  2. 短小精悍的多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  3. 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解

     本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并不低所以,本文的代码 存图只 ...

  4. 最短路算法----floyd算法

    目录 1:Floyd算法的介绍 2:Floyd算法的代码展现 3:Floyd算法举例 1:Floyd算法的介绍 Floyd算法是属于最短路算法的一种,它是用来求多源最短路径,换句话来说就是求任意两个点 ...

  5. 最小环算法求解(Dijkstra算法+Floyd算法)

    方法一: #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> ...

  6. 最短路最基本算法———Floyd算法

    关于floyd算法 算法简介 实现思想 核心代码 后记 一.floyd简介 引自百度百科 在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路 ...

  7. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]

    最短路径-Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...

  8. 最短路径:Dijikstra算法/Floyd算法

    目录 1.基础 2.单源最短路径--Dijikstra算法 3.所有顶点间的最短路径--Floyd算法 1.基础 2.单源最短路径--Dijikstra算法 思路 void ShortestPath_ ...

  9. 最短路径算法——迪杰克斯拉算法/floyd算法

    最短路径算法--迪杰克斯拉算法 Dijkstra算法的思想 1.设置两个顶点集S和T,集合S中存放已经找到最短路径的顶点,集合T中存放着当前还未找到最短路径的顶点: 2.初始状态下,集合S中只包含源点 ...

最新文章

  1. mongodb windwos 安装(转)
  2. Nhibernate 3.0 cookbook学习笔记 一对多与多对多映射
  3. Javascript基础回顾 之(一) 类型
  4. 紫书 例题8-10 UVa 714 (二分答案)
  5. 详细讲解设计跳表的三个步骤(查找、插入、删除)
  6. 如何清除html代码里的空格,如何从html源代码中删除空格
  7. 微擎应用笔记3--manifest.xml文件使用说明
  8. java 字符串 ansi转utf8_在Java中将ANSI字符转换为UTF-8
  9. 机器学习入门笔记(四):朴素贝叶斯分类
  10. 支持多序列化的RPC框架avro-rpc
  11. 为什么这本书大家都称好
  12. DPCM差分预测编码原理及实现
  13. python矩阵操作_python矩阵操作
  14. 时间或许从未流逝,而人在氧化新陈代谢与日升日落中,以自己为坐标,定义了时间!...
  15. Chrome 解决 CRX HEADER INVALID 问题
  16. 华为H5快游戏如何接入广告服务
  17. cass块参照怎么改颜色,CASS符号颜色自定义的诀窍,都在这里了!
  18. 目前云计算的优势,主要有哪些?
  19. kubectl插件管理工具krew
  20. 谷歌新发布的TWA:让你的PWA进入应用商店

热门文章

  1. Weex生态质量建设
  2. 【基础篇】C#基础知识——面向对象
  3. 7Z命令在linux下的使用
  4. 关于栈迁移的那些事儿
  5. 企业信息安全应对勒索软件的攻击难度提升
  6. 2022-2028全球与中国液相色谱软件市场现状及未来发展趋势
  7. 给图片加上水印php视频,如何使用PHP给图片加水印
  8. 华为云服务器 共享文件夹在哪个文件夹,用户数据安全存储 华为云空间这些功能大显身手...
  9. mysql更新多字段sql_sql的update语句 批量更新某字段
  10. N以内双素数 马蹄集