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

透彻理解迪杰斯特拉算法

Dijkstra算法的使用条件:图中不存在负权边。

---------------------------有待验证------------------------

Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索。 
把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于BFS搜索。

--------------------------------------------------------------

算法思想描述:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点之间的距离,是从v到此顶点(只包括S中的顶点为中间顶点)的当前最短路径长度。

注意:对算法思想描述中的加粗字体的理解非常重要,后面会在有权图的最短路径求解步骤中给出理由和陷阱。

原博客中有图和步骤表格,这里不再进行复制,有兴趣的同学可以移步文章开头链接,这里重新用另外一张图进行说明

步骤 S集合 U集合

1

选入a,此时S=<a>

此时最短路径a→a=0

以a为中间点,从a开始找

U=<v1、v2、v3、v4、v5、v6、b>

a→v1=2

a→v2=8

a→v3=1

a→其他U中的顶点=∞

发现a→v3=1权值最短

2

选入v3,此时S=<a、v3>

此时最短路径a→a=0,a→v3=1

以v3为中间点,从a→v3=1这条最短路径开始找

U=<v1、v2、v4、v5、v6、b>

a→v3→v2=8(比上面第一步的a→v2=8相等,保持不变)

a→v3→v6=10

a→v3→其他U中的顶点=∞(这里有a→v3→v1=∞,

比第一步中的a→v1=2要长),此时a到v1的权值更改为a→v1=2

发现a→v1=2权值最短

3 选入v1,此时S=<a、v3、v1>

此时最短路径a→a=0,a→v3=1,a→v1=2

以v1为中间点,从a→v1=2这条最短路径开始找

U=<v2、v4、v5、v6、b>

a→v1→v2=8(比上面第一步的a→v2=8相等,保持不变)

a→v1→v4=3

a→v1→其他U中的顶点=∞

发现a→v1→v4=3权值最短

4

选入v4,此时S=<a、v3、v1、v4>

此时最短路径a→a=0,a→v3=1,a→v1=2,

a→v1→v4=3

以v4为中间点,从a→v1→v4=3这条最短路径开始找

U=<v2、v5、v6、b>

a→v1→v4→v2=7(比上面第一步的a→v2=8要短)

此时a到v2的权值更改为a→v1→v4→v2=7

a→v1→v4→v5=6

a→v1→v4→b=12

a→v1→v4→其他U中的顶点=∞

发现a→v1→v4→v5=6权值最短

 5

选入v5,此时S=<a、v3、v1、v4、v5>

此时最短路径

a→a=0,a→v3=1,a→v1=2,

a→v1→v4=3,a→v1→v4→v5=6

以v5为中间点,从a→v1→v4→v5=6这条最短路径

开始找

U=<v2、v6、b>

a→v1→v4→v5→v2=8(比上面第四步的a→v1→v4→v2=7要长)

此时a到v2的权值更改为a→v1→v4→v2=7

a→v1→v4→v5→v6=10

a→v1→v4→v5→b=12

发现a→v1→v4→v2=7权值最短

 6  选入v2,此时S=<a、v3、v1、v4、v5、v2>

此时最短路径

a→a=0,a→v3=1,a→v1=2,

a→v1→v4=3,a→v1→v4→v5=6,

a→v1→v4→v2=7

以v2为中间点,从a→v1→v4→v2=7这条最短路径

开始找

U=<v6、b>

a→v1→v4→v2→v6=9

a→v1→v4→v2→其他U中的顶点=∞

发现a→v1→v4→v2→v6=9权值最短

 7  选入v6,此时S=<a、v3、v1、v4、v5、v2、v6>

此时最短路径a→a=0,a→v3=1,a→v1=2,

a→v1→v4=3,a→v1→v4→v5=6,

a→v1→v4→v2=7,a→v1→v4→v2→v6=9

以v6为中间点,从a→v1→v4→v2→v6=9这条最短路径

开始找

U=<v6、b>

a→v1→v4→v2→v6→b=11

发现a→v1→v4→v2→v6→b=11权值最短

 8  选入b,此时S=<a、v3、v1、v4、v5、v2、v6、b>

此时最短路径a→a=0,a→v3=1,a→v1=2,

a→v1→v4=3,a→v1→v4→v5=6,

a→v1→v4→v2=7,a→v1→v4→v2→v6=9,

a→v1→v4→v2→v6→b=11

 U集合已空,算法结束。

其中每次步骤执行时,从S集合确定中间点和开始查找的最短路径,依次遍历U集合中的 点,遵循的原则是,按最短路径长度的递增次序依次把第二组的顶点加入S,保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度,在寻找最短权值时要注意查找前面步骤是否已经查找记录过。

理解最短路径-Dijkstra算法的更多相关文章

  1. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  2. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  3. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  4. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  5. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  6. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  7. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  8. 单源最短路径——Dijkstra算法学习

    每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...

  9. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

随机推荐

  1. 把云数据库带回家!阿里云发布POLARDB Box数据库一体机

    9月26日,2019杭州云栖大会上,阿里云宣布正式推出高性能数据库一体机——POLARDB Box,用户部署在自有数据中心即可享受云数据库的便捷体验,同时还为Oracle等传统数据库用户提供一键迁移功 ...

  2. thinkphp 空控制器

    空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化. 大理石平台价格表 现在我们把前 ...

  3. oxyplot 禁止拖动,缩放

      <oxy:Plot> IsZoomEnabled= IsPanEnabled=/> IsZoomEnabled= IsPanEnabled=/> 关键代码: IsZoomE ...

  4. JS 变量的数据类型转换

    变量的类型转换,一般情况是JS自动转换的,但也有些时候需要手动转换. 1.其它类型转成布尔型 函数和方法的区别 Boolean(a)  //函数是可以独立使用的 document.write(a)   ...

  5. 分享一份Java架构师学习资料,2019年最新整理!

    分享一套不错的架构师学习参考资料,免费领取的,无任何套路! 关注Java大后端公众号,在后台回复关键字:大大,即可免费领取,觉得资料不错,转发给其他朋友呗- 长按关注Java大后端公众号领取.

  6. 1.1_springboot2.x与缓存原理介绍&使用缓存

    一.springboot与缓存介绍&使用缓存 1.JSR107 JAVA Cahing定义了5个核心接口,分别是CachingProvider.CacheManager.Cache.Entry ...

  7. WPF基础之Grid面板

    一.显示 Grid的线条,设置ShowGridLiens="True".

  8. 常用Linux Tips(不定期更新)

    查看本机所有开放端口 lsof -i -P | grep -i listen 查看一段文本单词出现频率 awk '{b[length($0)]++;total_lines++;for(i=1;i< ...

  9. 布局页中的特殊情况(比如说只有某页有的banner)

    仅作代码记录之用 /WEB-INF/tags/section.tag <%@ tag language="java" import="java.util.*,jav ...

  10. 2016.11.5初中部上午NOIP普及组比赛总结

    2016.10.29初中部上午NOIP普及组 这次比赛算是考的最差的一次之一了,当中有四分之三是DP. 进度: 比赛:没分+0+没分+40=40 改题:AC+0+没分+40=140 TurnOffLi ...