关于Floyd算法 和 Dijkstra算法
Floyd和Dijkstra算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法,不同点在于Floyd算法求加权图中所有顶点之间的最短路径; Dijkstra算法在求一点到其他所有顶点的最短路径
Dijkstra算法:
依次求距离源点的最短路径,再求还不确定的最小权值时(再求还未确定的顶点),就是从最后确定的最新权值的基础上(从那个顶点出发)遍历与他相连的边,在所有还未确定的顶点中找出最小的权值,即是确定下新的最短路径(最新顶点)
1.假设从D点开始,D为起始点,Visited[D] = 0 遍历与D相连的所有点,发现E最短,但D到BCF的距离也保留下来,保存在一个Visited数组里,E保存在S集合中,表示确定下来的顶点.
2.因为E与D距离最近,第二点从E开始,遍历E,CE为4,EF为5,所以计算D到F距离为6,比3大,所以保留3(如果新计算的权值大于原有的距离,保留新的权值),同理保留DF的3,ED的2因为visited[D] 已经确定下来 ,也因为 visited[D] = 0, visited[E] + 2 肯定>0 ,所以2无效的, S集合确定下来的顶点不用去遍历了,当然遍历了也没有关系,只是增加了运算的时间
3.确定了DC最近,下一个顶点就从C点出发,遍历C的所有顶点
我们是从原先顶点遍历中找出最短的权值,再与之前的还没确定下来的距离相比,找出最短的距离,确定最新的顶点
在无向图中,Dijkstra算法和图的层序遍历,BFS类似.但也不是BFS.
Floyd算法:
递归地进行n次更新, 每次确定同方向的相连的三个顶点,如果原先最远的两个顶点之间无边相连或者有边相连且权值大于相连的三顶点的权值相加,最远的两个顶点之间的距离被重新赋值为新的两权值相加的那个权值(如果小于,就保留原先的权值),再此基础上,进行新一轮的三顶点的比较,前一轮的三个顶点相加的权值为看作新一轮的其中的一个权值(如果原先小于的话,就用原先的最远距离的权值,第三个顶点不用加入)
比如原先AB权值6,但ACB权值相加为5,那么AB间的权值就为5,再计算AD的距离时,就用ACBD,权值相加为10,
k就表示迭代的次数,每次迭代只比较确定三个顶点,,下一次迭代,在此基础上再多一个顶点,将原来的基础看作一条权值,两个顶点,然后关联更多顶点,
path递归调用,每三个顶点比较确定相连的边,如果第三顶点加入,path指向第三顶点,如果不加入,就指向两顶点的后一顶底,再次基础上,新指向的顶点就是之前指向的那个顶点指向的顶点(就是跟起始点最近相连的顶点),输出时,就可以一层一层在返回指出这条路径,Floyd算法最好使用邻接矩阵
证明:
Dijkstra算法可以用反证法证明, 假设有两点之间的距离不是最短的,因为我们是从原先顶点遍历中找出最短的再与之前的还没确定下来的距离相比,找出最短的距离, 所以原先的顶点有比找出的顶点权值更小的权值,这明显违背, 第二种情况, 我们简单化,最新确定的距离AD 为10 有AC为3 CD 为7 ,当出现了更短的情况,如有AE为4,ED为5, 因为AE比AD短, 所以E点肯定比D点更早确定,E点确定时,肯定遍历了E点,AD为9的情况也早已确定,我们找出最短的权值后 相加 与之前的还没确定下来的距离也进行过比较,在确定最短,所以这种情况也违背,所以Dijkstra算法是正确的
Floyd算法 我只能感觉他是对的,,但很难证明,在这里分享一篇大佬写的比较好的,我也能看懂的
https://www.jianshu.com/p/21c9d60e7a03【图论】Floyd算法的证明
写的不好,还请包含
分享我写的代码:https://github.com/zhangweifeng66/algorithms
关于Floyd算法 和 Dijkstra算法相关推荐
- 最短路径问题(Floyd算法、Dijkstra算法、Bellman-Ford算法、SPFA算法)
导入 最短路径问题是指在一幅带权图中,找出连接两个顶点之间的所有路径中,边权和最短的那一条.如下图就是一幅带权图,边上的数字就代表该边的权值.解决最短路径问题有多种不同的算法,本文将对它们的基本思想与 ...
- Floyd算法与Dijkstra算法的区别
Floyd算法与Dijkstra算法的区别? 1.如果依次对某个顶点运用Dijkstra算法,则与Floyd算法相2113比,很多路径和结果计算是重复的,虽然复杂5261度相同,但4102是运算量差了 ...
- 11.贪心算法入门-----Dijkstra算法详解
Dijkstra算法详细(单源最短路径算法) 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算 ...
- 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...
- 网络协议梳理(三)(网关和路由器、动态路由算法、Bellman-Ford算法、Dijkstra算法、动态路由协议、TCP和UDP)
MAC 头和 IP 头的细节 在任何一台机器上,当要访问另一个IP地址的时候,都会使用CIDR和子网掩码去判断目标IP地址和当前机器的IP地址是否属于同一网段. 如果是同一网段--如果ARP缓存中存有 ...
- 双向Dijkstra算法、Dijkstra算法对比
去看[原文] Dijkstra算法是一种单向的最短路径算法,有研究者就提出了一种优化方法,即双向Dijkstra算法.其主要思想就是从起点和终点同时开始搜索,这样应该能够提升算法效率.事实证明,在大部 ...
- Floyd算法、Dijkstra算法例题
二 1.用Floyd算法求解下图各个顶点的最短距离. 2.对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径. 2.解析 1)用Floyd算法求解各个顶点的最短距离. 第一步:画出初始化距离 ...
- 07-图4 哈利·波特的考试(Folyd算法,Dijkstra算法)
07-图4 哈利·波特的考试 分数 25 作者 陈越 单位 浙江大学 哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成 ...
- 无向图的最短路径求解算法之——Dijkstra算法
在准备ACM比赛的过程中,研究了图论中一些算法.首先研究的便是最短路的问题.<离散数学>第四版(清华大学出版社)一书中讲解的Dijkstra算法是我首先研究的源材料. 如何求图中V0到V5 ...
最新文章
- 提交svn的时候,提示丢失了预定增加的xxxx
- Django框架(16.Django中的模型类管理器以及自定义管理器)
- linux安装报错之:ifconfig command not found解决
- C++ 对引用的理解5
- 原来AI也可以如此简单!教你从0到1开发开源知识问答机器人
- 吓skr人!BATJ六大男神来了,还说......
- 小甲鱼python电子版_零基础入门学习Python 小甲鱼出品 (全42集)
- 尽善尽美之作《Python Qt GUI与数据可视化编程》
- scratch3文件转exe文件方法
- 关于 Spring 中 getBean 的全流程源码解析
- 【算法-1】输出网格图形
- 人均 3.6万行代码, C++ 成最烫手山药:腾讯首度披露技术研发数据!
- 陷波滤波器消除周期噪声python_车载功放本底噪声的机理及对策 wdele
- 好东西大家分享: 怎么画数据流图 1
- 网络与信息安全实验总结(报文监听与分析,漏洞扫描,逆向工程,安全产品)
- 2022-2028全球管道式全屋除湿机市场现状及未来发展趋势
- 铁匠smith_铁匠的大气散射
- 【计算机网络】第一章:体系结构
- javascript取本周星期一到星期天对应日期的通用方法
- 云服务器的快照功能是什么?