《算法》C++代码 Floyd
今天写写最短路径的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的更多相关文章
- Floyd算法(原理|代码实现)
http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是 ...
- Floyd-Warshall算法,简称Floyd算法
Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3). 使用条件&范围通常可以在任何图中使用,包括有向图.带负权边的图. Floyd-W ...
- 一步步学算法(算法分析)---6(Floyd算法)
Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命 ...
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...
- php四种排序算法实现代码
分享php排序的四种算法与代码. 冒泡:function bubble_sort($arr){ $num = count($arr); for($i=0;$i<$num;$i++){ for($ ...
- 排序算法Java代码实现(一)—— 选择排序
以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...
- 【转】Algorithms -离散概率值(discrete)和重置、洗牌(shuffle)算法及代码
离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/1 ...
随机推荐
- MySQL数据库实验六:存储过程建立与调用
实验六 存储过程建立与调用 一.实验目的 理解存储过程的概念.建立和调用方法. 二.实验环境 三.实验示例 1.定义一个函数,按性别计算所有学生的平均年龄. CREATE FUNCTION aver ...
- POJ-3187 Backward Digit Sums---枚举全排列
题目链接: https://vjudge.net/problem/POJ-3187 题目大意: 输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列 ...
- 反射java
所谓反射(Refection),其实就是程序自己能够检查自身信息,就像程序会通过镜子反光来看自己本身一样.反射使得 Java语言具有了“动态性”,即程序首先会检查某个类中的方法.属性等信息,然后再动态 ...
- python2.7 加密模块 解决各种坑
1 Python27 安装crypto Windows安装 在Windows上安装的时候直接 pip install pycrypto会报错,参考:http://blog.csdn.net/teloy ...
- Yarn下Map数控制
public List<InputSplit> getSplits(JobContext job) throws IOException { long minSize = Math.max ...
- Drupal 新建Modules
最简单的模块包含了2个文件夹,它们放置于同一个文件夹下:包含模块信息的文件以.info为后缀名,而实现功能的文件则以.module结尾. 可以给模块一个友好的(human-readable)名字,但是 ...
- 【Java】基础:常见修饰符(权限修饰符以及abstract、static、final等)与变量的描述
1. 修饰符 public.protected.private.default abstract.static.final. abstract:抽象类.抽象方法 static:静态变量.静态方法.静态 ...
- top小火箭
// my.js function $(id){return document.getElementById(id)};function show(obj){obj.style.display = & ...
- avalon.js的循环操作在表格中的应用
avalon.js的循环操作在表格中的应用 一个JAVA开发,因为做的门户系统中,数据的展示加载的速度很影响使用效果,想到的是尽量少的请求后台,然后接触到了avalon,看介绍这是一个很轻很轻的MVV ...
- BZOJ4128: Matrix(BSGS 矩阵乘法)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 813 Solved: 442[Submit][Status][Discuss] Descriptio ...