一、简介

迪杰斯特拉(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算法的更多相关文章

  1. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  2. 【转载】Dijkstra算法和Floyd算法的正确性证明

      说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正   ----------- ...

  3. Dijkstra算法和Floyd算法的正确性证明

    说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正   ------------- ...

  4. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...

  5. 【转】最短路径——Dijkstra算法和Floyd算法

    [转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...

  6. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  7. 最短路径—大话Dijkstra算法和Floyd算法

    Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...

  8. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...

  9. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  10. 【转载】最短路径—Dijkstra算法和Floyd算法

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

随机推荐

  1. 读取json数据封装

    前言:做自动化常用公共方法 import json class ReadJson(): def __init__(self): self.data = self.read_data() #读取JSON ...

  2. Navicat 导入,导出数据 etc

    Navicat 不仅做了分页查询, 显示 `SELECT *,rowid "NAVICAT_ROWID" FROM "main"."Table_100 ...

  3. 把cgrep mgrep集成到bashrc

    https://android.googlesource.com/platform/build/+/android-4.4.3_r1/envsetup.sh 在~/.bashrc里面增加: #Andr ...

  4. PHP基础之函数

    函数概念: 函数是用来完成某种特定任务的可重用代码块; 函数可以使程序更具模块化,拥有良好的结构; 函数定义后在程序中可以重复调用; 函数分为内置函数和自定义函数 考点: 变量的作用域和静态变量 延伸 ...

  5. Centos7.3安装,并设置网络和防火墙

    下载centos7.3安装ISO 最小化安装,随后打通网络,完成网络设置.安装VIM,关闭firewalld防火墙,打开iptables防火墙 重启, vim /etc/sysconfig/netwo ...

  6. python学习--12 基本数据类型

    数字 int -int  功能 1.转换 例如: a = '123' # 字符串print(type(a),a)b = int(a) # 将字符串转换成intprint(type(b),b) 运算结果 ...

  7. 记录学习Python的第一天

    这是我的第一篇博客,也是我学Python的第一天. 写这篇博客主要目的是为了记下我学习Python的过程以及所学到的知识点.我所学的是Python3版本,我所学的内容有如下几点: 1.python3中 ...

  8. Vue起飞前的准备

    Vue起飞前的准备 一.什么是ECMAScript,以及es6的诞生? 1997年 ECMAScript 1.0 诞生 1999年12月 ECMAScript 3.0诞生,它 是一个巨大的成功,在业界 ...

  9. JVM Java 内存区域透彻分析(转)

    出处:  Java 内存区域透彻分析  Java8内存模型—永久代(PermGen)和元空间(Metaspace) 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这 ...

  10. vim编辑器中的替换(转)

    转1:https://www.cnblogs.com/david-wei0810/p/6385988.html 转2:https://blog.csdn.net/doubleface999/artic ...