Floyd算法【图解证明】
目录
- 算法介绍
- 排序法证明
- 图解证明
- 1. 最优解集合的初始化
- 2. 最优解集合的扩大
- 3. 最优解集合的合并
- 4. 全集最优解
算法介绍
Floyd参考:这位作者的代码和公式已经非常棒了,所以对于过程和定义就不过多赘述了
排序法证明
其实上文链接也有证明过程,也有去翻过其他博客,基本都是这个证明过程,不过这个证明过程有些问题。
该证明过程的前提条件是点集内部是从小到大排序的,证明原理就是当求到k时,小于k的都已经得到最优解。
这样的证明限制了点集序号必须严格排序计算,但实际在计算过程中,点序是任意的,倒序、随机抽取都可,所以排序法的证明相对局限。
倒序: 6 5 4 3 2 1
奇偶互换:2 1 4 3 6 5
随机抽取:2 5 1 3 4 6
这里就不贴代码了,总之试过都AC了。
图解证明
由于各点之间没有顺序关系,为了避免误会,这里就不用1234…来标记了,直接用等价字母替代。
我们最终的目的是找一条最短路径,通往a->k
:a->b->c->d->e->f->g->h->i->j->k
,假设存在这么一条最短路径,即下图:
从a开始,经过许多点,最终到达k,此路径是最短的,故这里相邻两点之间肯定是互相连通着的。
很明显发现,比如a->c
其代价很大:100
,而a->b->c
的代价很小:dis[a][b]+dis[b][c]=2
,故最短路径走a->b->c
。
1. 最优解集合的初始化
首先我们任意取一点:e
我们可以将e
看作一个只包含自身的最优集合
我们不考虑其他点,只考虑e本身和其临近点,即:{d,e,f}
可以发现 能够得到 {d,e,f} 中任意两点间的最优解,即这个点集中互相到达情况下的最短路径。
以e
为跳板,Floyd一定会遍历到:dis[d][f]=dis[d][e]+dis[e][f]
;而根据最短路径图可以得知,该路径值就是dis[d][f]
的最优解。
故此时集合{d,e,f}
内任意两点间的dis
都是最优的.
此时是以e
为选中点,将其左右临近点
纳入自身的最优集合之中
2. 最优解集合的扩大
我们紧接着再假设下一个选取的点为:f
我们可以发现在 {d、e、f}
点集中,以f
为选中点,可以与临近点g
取得联系。
例如dis[d][g]=dis[d][f]+dis[f][g]
,从d->g
的路线即d->e->f->g
。
我们不考虑其他点,只考虑集合 {d、e、f}
和临近点g
,Floyd算法会将任意两点间以f
为跳板,计算出其中最短的路径,最终在这个{d,e,f,g}
点集中,任意两点都是最短路径。
此时我们是以f
为选中点,将右边的临近点g
纳入集合(左边的临近点
已经是最优集合内的点)。
3. 最优解集合的合并
由于是随机选择,出现下面情况的可能性也是非常大的。
我们依次选择了e,f,i,h
作为选中点,最后发现存在两个最优解集合{d,e,f,g}
、{g,h,i,j}
。
此时我们以g
为选中点,可以发现,两边集合都可以通过g
作为跳板,例如可推出最优距离dis[d][i]=dis[d][g]+dis[g][i]
。
在这个{d,e,f,g,h,i,j}
的集合中,经过Floyd的遍历,该集合以g为跳板,最终形成集合内最优解,集合内任意两点之间的dis
都是最优的。
此时我们是以g
为选中点,因左右两边都是集合,故发生合并。
4. 全集最优解
依据上述步骤,每一个点都会被选择一次,最优解集合会不断地扩张,最终整个点集都纳入最优解集合。
a->k
得到了最优解:a->b->c->d->e->f->g->h->i->j->k
。
总结:选择任意点集(单独一个点也是一个点集),其可以吸纳融合临近的点集。故通过不断地选择任意点集,局部的点集合不断吸纳融合扩大,最终得到全局合并的最优集合。
Floyd算法【图解证明】相关推荐
- 最短路径Floyd算法图解与C++实现
邻接矩阵特征 Floyd算法建立在对图的邻接矩阵的操作上,理解Floyd首先要理解邻接矩阵 对于有向图,邻接矩阵的一行代表该顶点的出边,一列代表该顶点的入边 对于无向图则不区分出边与入边,邻接矩阵表示 ...
- 关于Floyd算法 和 Dijkstra算法
Floyd和Dijkstra算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法,不同点在于Floyd算法求加权图中所有顶点之间的最短路径; Dijkstra算法在求一点到其他所 ...
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- SHU1757 村村通工程(Floyd算法)
Description 某市启动村村通工程后,已修建了很多路,但尚未完成整个工程.不过路多了也烦恼,每次要从一个村镇到另一个村镇时,都有许多种道路方案可以选择,但走最短距离总是每个人追求的目标. 现在 ...
- 最短路径—Dijkstra算法和Floyd算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 短小精悍的多源最短路径算法—Floyd算法
前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...
- “chaos”的算法--之Floyd算法详解(求最短路径)
倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Fl ...
- 最短路径:Dijkstra算法和Floyd算法
一.Dijkstra算法(单个顶点到其他顶点的最短距离) 定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...
- Floyd算法的动态规划本质
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
最新文章
- php smtp tls,php – RoundcubePostfix SMTP:SSL例程:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c...
- 【正一专栏】里皮神奇不再,国足梦断伊朗魔鬼主场
- Windows四大傻X功能——那些拖慢系统性能的罪魁祸首
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】
- 二维温度场matlab编程,二维温度场重建算法(价钱可议)
- php版本7历史,php的版本发展历史(1995-2020)
- layui单选框verify_layui 单选框选中事件
- python画简单图-python绘制简单彩虹图
- cdh用户权限_CDH6.3.2之Sentry权限管理(三)
- angularjs 指令详解
- Windows驱动加载工具---DriverLoader
- 鼎捷软件ERP,MES等系统构筑制造企业信息化系统
- 2021年茶艺师(初级)考试内容及茶艺师(初级)模拟考试
- Windows 7 SP1相关资源下载
- 什么叫Jour-fix
- 【译】eBPF 概述:第 4 部分:在嵌入式系统运行
- 你需要立即停止的9个习惯! 2012-03-11 10:01:41
- mmsegmentation导出onnx模型的问题
- linux 脚本usleep,Linux的sleep()和usleep()的使用
- 如何在桌面版linux怎么安装360安全卫士?