Dijkstra算法和Floyd算法
一、简介
迪杰斯特拉(Dijkstra)算法和弗洛伊德(Flyod)算法均是用于求解有向图或无向图从一点到另外一个点最短路径。
二、Dijkstra
迪杰斯特拉算法也是图论中的明星算法,主要是其采用的动态规划思想,使其在数据结构、算法、离散数学乃至运筹学中都扮演重要的角色。以下图为例:
以A为起点,首先走一步,共有三条边,分别如下:
AB(12),AF(16),AG(14)其中最短的是节点B,将AB(12)放入辅助向量。
接着,各节点均继续向下走,此时可以找出4条边。
ABC(22),ABF(19),AF(16),AG(14),同样找出最小值放入向量中。{AB(12),AG(14)}
此后步骤完全相同
ABC(22),ABF(19),AF(16),AGF(23),AGE(22),选中AF(16)。
同样,接下来的步骤有:ABC(22),AFC(22),AFE(18),AGE(22),选中AFE(18);
ABC(22),AFC(22),AFEC(23),AFED(22),这种情况随便选取一个最小值,以ABC(22)为例;
ABCD(25),AFED(22)选中后者,至此,已经完全找到A和所有节点之间的最短路径及最短路径的长度。
最短路径向量为{AB(12),AG(14),AF(16),AFE(18),ABC(22),AFED(22)}
三、Floyd
弗洛伊德是另外一种求最短路径的方式,与迪杰斯特拉算法不同,弗洛伊德偏重于多源最短路径的求解,即能迪杰斯特拉能够求一个节点到其余所有节点的最短路径,但是弗洛伊德能够求出任意两个节点的最短路径,当然迪杰斯特拉重复N次也能达到目标。两种方式的时间复杂度均为O(n^3),但弗洛伊德形式上会更简易一些。
以下面的有向有权图为例:
老版visio不知道为啥这么糊?
首先写出图的邻接矩阵Adj
A | B | C | D | |
A | 0 | 4 | 2 | 6 |
B | 5 | 0 | ∞ | 12 |
C | ∞ | ∞ | 0 | 3 |
D | 7 | 1 | ∞ | 0 |
若想缩短两点间的距离,仅有一种方式,那就是通过第三节点绕行,如果我们假设仅能通过A点绕行,那么仅需判断是否现有的距离Adj[i][j]小于Adj[i][1]+Adj[1][j]的距离,如果有更短的选择,那么进行更新就好了。首先第一行和第一列肯定不会更新,然后对角线也不必更新。【其实通过观察可以知道,第三行也不会进更新,因为C根本无法绕到A】
0 | 4 | 2 | 6 |
5 | 0 | 7 | 11 |
∞ | ∞ | 0 | 3 |
7 | 1 | 9 | 0 |
接下来,开放绕行节点2,那么就相当于可以经过节点1和2进行绕行。更新条件是Adj[i][j]>Adj[i][2]+Adj[2][j],除去第2行,第2列和对角线不需要进行判断。可以到D到C通过B-A会比仅通过A更短。
0 | 4 | 2 | 6 |
5 | 0 | 7 | 11 |
∞ | ∞ | 0 | 3 |
6 | 1 | 8 | 0 |
然后开放节点3.
0 | 4 | 2 | 5 |
5 | 0 | 7 | 10 |
∞ | ∞ | 0 | 3 |
6 | 1 | 8 | 0 |
最后开放节点4.
0 | 4 | 2 | 5 |
5 | 0 | 7 | 10 |
9 | 4 | 0 | 3 |
6 | 1 | 8 | 0 |
最短路径不适用于负权回路,或负权环,因为每次绕行都会减小最短路径,因此负权回路或者说负权环不存在最短路径。
Dijkstra算法和Floyd算法的更多相关文章
- 最短路径——Dijkstra算法和Floyd算法
Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...
- 【转载】Dijkstra算法和Floyd算法的正确性证明
说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正 ----------- ...
- Dijkstra算法和Floyd算法的正确性证明
说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正 ------------- ...
- 最短路径Dijkstra算法和Floyd算法整理、
转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...
- 【转】最短路径——Dijkstra算法和Floyd算法
[转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...
- 最短路径—Dijkstra算法和Floyd算法
原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...
- 最短路径—大话Dijkstra算法和Floyd算法
Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...
- 最短路径—Dijkstra算法和Floyd算法【转】
本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...
- 图的最短路径——dijkstra算法和Floyd算法
dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...
- 【转载】最短路径—Dijkstra算法和Floyd算法
注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...
随机推荐
- python邮件发送自动化测试报告
话不多说直接贴代码 # encoding: utf-8import smtplib #发送邮件模块from email.mime.text import MIMEText #邮件内容from emai ...
- vba Excel连接数据库
PostgreSql: 第一步 在网上下载postres的驱动程序,之后安装,下载地址:https://www.devart.com/odbc/postgresql/download.html 第二步 ...
- AD域环境搭建
1.安装Windows server服务器 我安装的是Windows server 2012 Standard x64 下载地址:https://pan.baidu.com/s/1dZ_B5JIEit ...
- 2019春《C语言程序设计》课程设计的安排
课程设计的安排 课前准备: 要求同学们注册码云,并登陆: 要求组长加入由老师创建的一级组织:"2019春C语言": 要求组长建立二级组织,给自己的小组取个好听的名字,并邀请本组成员 ...
- webstorm对引入的css资源进行提示
- day0~day13
day0 day1 day2 day4 day5 day7 day9 day10 day12 day13
- LC 417. Linked List Cycle II
题目描述 Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...
- S03_CH11_基于TCP的QSPI Flash bin文件网络烧写
S03_CH11_基于TCP的QSPI Flash bin文件网络烧写 11.1概述 针对ZYNQ中使用QSPI BOOT的应用,将BOOT.bin文件烧写至QSPI Flash基本都是通过USB C ...
- 解决使用绝对定位absolute后,margin:0 auto居中方法失效(转)
https://blog.csdn.net/qq_40678503/article/details/82780680
- Unity性能优化-遮挡剔除
1. Occlusion Culling-遮挡剔除的含义:没有在Camear视野范围内的游戏物体不进行渲染Render(默认情况下,Unity是会渲染所有GameObject,无论Camear是否看得 ...