今天写写最短路径的Floyd算法(有翻译叫弗洛伊德,不过这奇葩翻译用来读读就好……)。

这个算法的实质,广义来讲,其实是DP(动态规划)。其实按说,算法应该先说说什么贪心、搜索、DP、二分之类的基本算法的,但我觉得太广的东西对没有基础的人来说讲起来不清楚,还是先写写比较典型的一些算法比较好。而且这个系列是C++代码,并非过于详细的分析描述,那些以后有时间再写。

Floyd,求一个图中任意两点间的最短路径。图中有N个点,则算法复杂度是O(N³),空间复杂度是O(N²),编程复杂度极低。

先说下其中的基本操作,若i->j的当前路径不如i->k->j短,则更新最短路。这个操作叫做“松弛操作”,是最短路径算法中很基础的操作,就像排序中的“交换操作”一样基础,Floyd、Dijkstra、SPFA都是基于这个操作的。写成代码就是:

  if(d[i][j]<d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];

Floyd算法的思想是,以每个点分别为中间结点(上式中的k),去更新所有路径。例如对于u->v来说,最短路径是u->k1->k2->k3->k4->v,假设k1<k3<k2<k4,那么实际过程就是:

  0、算法初始化,定义一个d数组,存的是初始任意两点间距离,若存在边u->v,则d[u][v] = u->v;若不存在边u->v,则d[u][v] = ∞(其实就相当于图的邻接矩阵,只不过没有的边补成了∞)

  1、不妨设原本d[u][v] = ∞

  2、在k=k1时,d[u][k2] = d[u][k1]+d[k1][k2] = u->k1->k2;

  3、在k=k3时,d[k2][k4] = d[k2][k3]+d[k3][k4] = k2->k3->k4;

  4、在k=k2时,d[u][k4] = d[u][k2]+d[k2][k4] = u->k1->k2->k3->k4;

  5、在k=k4时,d[u][v] = d[u][k4]+d[k4][v] = u->k1->k2->k3->k4->v;

  6、算法结束,d[u][v]中所存为最终最短路径,所有点对皆是如此,所以全部过程完结之后,任意两点的最短路径就都求出来了。

其实,这推导过程中,有些问题没有考虑到,因此算法的正确性在此文中并没有得到完整证明。时间所限,不再细说,有兴趣的同学可以想想,我有时间会再提的。

代码很简单,就三行:

for(int k=;k<=N;++k)
for(int i=;i<=N;++i)
for(int j=;j<=N;++j) d[i][j] ← d[i][k]+d[k][j]; // 此处表示用右侧更新左侧,即松弛操作

《算法》C++代码 Floyd的更多相关文章

  1. Floyd算法(原理|代码实现)

    http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是 ...

  2. Floyd-Warshall算法,简称Floyd算法

    Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3). 使用条件&范围通常可以在任何图中使用,包括有向图.带负权边的图. Floyd-W ...

  3. 一步步学算法(算法分析)---6(Floyd算法)

    Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命 ...

  4. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

  5. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  6. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  7. 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

    1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...

  8. php四种排序算法实现代码

    分享php排序的四种算法与代码. 冒泡:function bubble_sort($arr){ $num = count($arr); for($i=0;$i<$num;$i++){ for($ ...

  9. 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...

  10. 【转】Algorithms -离散概率值(discrete)和重置、洗牌(shuffle)算法及代码

    离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/1 ...

随机推荐

  1. 了解Web及网络基础(一)

    在理解HTTP之前,先大概知道TCP/IP是什么. 当不同的硬件.操作系统或者不同的设备想要进行通信,那么双方就要遵循同一个协议才可以进行通信,而这个协议的通称就是TCP/IP,也就是说TCP/IP之 ...

  2. TeXstudio安装后提示no LaTeX distribution found on this system

    应该是设置一下用户变量,而非系统变量,用TeXLive 2015和MikTeX都不好使,最后设置了用户变量好使了 S:\TeX\MiKTeX 2.9\miktex\bin\x64\ 也是醉醉的 不过等 ...

  3. IOS 解析Json数据(NSJSONSerialization)

    ● 什么是JSON ● JSON是一种轻量级的数据格式,一般用于数据交互 ● 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除 外) ● JSON的格式很像OC中的字典和数组 ...

  4. 常用mysql系统参数参考

    http://aaronsa.blog.51cto.com/5157083/1741481

  5. 【BZOJ1269】[AHOI2006] 文本编辑器editor(Splay)

    点此看题面 大致题意: 让你维护一个字符串,有插入字符串.删除区间.反转区间和输出单个字符操作. \(Splay\) 这应该是一道比较简单的\(Splay\)题(虽然因为各种细节我调了很久). 我们可 ...

  6. asp .net core 中间件的简单 使用

    在startup 的cs文件中 2.捕获异常的中间件 可以在浏览器中 显示异常信息 在开发环境的境况下,该中间件会帮你 捕获异常

  7. IBM区块链总经理谈区块链

    IBM区块链总经理谈区块链:3.4年前IBM的区块链人员就达到了1500人  Captain Hiro 2018-03-20 16:22 发布在 区块链 3 18349 CCN的记者Eric Eiss ...

  8. SQL之Case when 语句

    --case简单函数 (把多列变成单列) ' then '女' when ' then '男' else '其他' end from [Northwind].[dbo].[Users] --case搜 ...

  9. python 生成器与迭代器(yield 用法)

    背景 首先,我不会解释这两个名词,我看过很多遍解释,可还是看不懂,还是直接看使用情景吧. 我们以佩波拉契数列为例,当我们不知道迭代器的情况下,我们写出来的代码可能是这样子的: '''这种方式计算fib ...

  10. SpringMVC使用ModelAndView的相对路径和绝对路径的问题

    例如:abc/a/a.jsp,想要跳转到根目录的b.jsp 使用 ModelAndView 跳转, 若引用:org.springframework.web.portlet.ModelAndView 这 ...