理解最短路径-Dijkstra算法
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算法的更多相关文章
- 网络最短路径Dijkstra算法
最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 最短路径-Dijkstra算法与Floyd算法
一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ADCE:3 ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- 有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 单源最短路径——Dijkstra算法学习
每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...
- 图论——最短路径 Dijkstra算法、Floyd算法
1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...
随机推荐
- vue语法糖
加冒号,就是个语法糖 两点: 例如 export default { data(){ return { item: { src: 'xxxxx' } } } } <img :src='item ...
- HDU-3068-最长回文-马拉车算法模板题
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为 ...
- Java 的锁-老王女儿的爱情
对象锁: new一个对象,都会给这个实例创建一把锁,对象中的方法必须在实例创建后,通过调用方法获取锁,一个线程进去这个方法之前拿到对象的锁,才能调用方法,否则被阻塞,举个例子,老王有个如花似玉的女儿, ...
- python-包管理工具-pip
目录 Python pip pip相关命令 解决pip相关问题 Python pip回到顶部 Python最让人的喜欢的就是它有丰富的类库和各种第三方的包,而对于这些包的下载.删除等管理操作,就要用到 ...
- Django框架基础-MTV模型
一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...
- JS数组 谁是团里成员(数组赋值)var myarray = new Array(66,80,90,77,59);//创建数组同时赋值
谁是团里成员(数组赋值) 数组创建好,接下来我们为数组赋值.我们把数组看似旅游团的大巴车,大巴车里有很多位置,每个位置都有一个号码,顾客要坐在哪个位置呢? 第一步:组个大巴车 第二步:按票对号入座 大 ...
- [NOIP2019模拟赛]HC1147 时空阵
题目描述: 幽香这几天学习了魔法,准备建造一个大型的时空传送阵. 幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和从b到a都只需要单位1的时间. ...
- html-圣杯布局
1.两边固定 当中自适应 2.当中列要完整显示 3.当中列要优先加载 浮动: 搭建完整的布局框架 margin 为赋值:调整旁边两列的位置(使三列布局到一行上) 使用相对定位:调整旁边两列的位置(使两 ...
- 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势
启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...
- 数据库存含中文的json 时避免存成中文的ascii
使用json.dumps将dict转换为json时 如果包含中文 会将中文变成中文对应的ascii编码 当把这样的json存进数据库再取出之后反斜杠没有了会变成: 使用 json.dumps(x,en ...