1、什么是Dijkstra算法

杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

2、Dijkstra算法介绍

算法特点:迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

3、 单源最短路径问题

例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。
(顶点之间连线方框里的数字表示两点之间的距离,例如1——>2顶点之间的距离为1;2——>3之间的距离为9)

首先我们使用二维数组e来储存顶点之间边的关系,e1即表示1、2两顶点之间的权数(距离),现初始值如下,各顶点之间没有直接路径的我们表示为无穷大,自身顶点之间即e1=0。

然后我们用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下:

我们将此时dis数组中的值称为最短路径路程的“估计值”。通过dis数组可知当前离一号顶点最近的是2号顶点。当选择了2号顶点后,dis2的值就已经从“估计值”变成了“确定值”,即1号顶点到2号顶点的最短路程就是当前dis2的值。

接下来再看2号顶点有哪些出边,有2——>3和2——>4这两条边。先讨论通过2——>3这条边能否让1号顶点到3号顶点的路程变短,也就是说现在来比较dis3和dis2+dis2的大小。

由图表可知dis3=12,dis2+e2=10,因此dis3更新为10.这个过程的专业术语叫做“松弛”,1号顶点到3号顶点的路程即dis3,通过2——>3这条边松弛成功。这便是Dijkstra算法的主要思想:通过“边”来松弛1号顶点到其余各个顶点的路程。
同理,通过2——>4(e2)可将dis4更新为4。

刚才我们对2号顶点所有的出边进行了松弛,松弛之后的dis数组更新为:

继续对剩下的3、4、5和6号顶点中,选出离1号顶点最近的顶点。通过上面更新过的dis数组,当前离1号顶点最近的是4号顶点。此时,dis4的值已经从“估计值”变为了“确定值”。下面继续对4号顶点的所有出边(4——>3,4——>5和4——>6)用刚才的方法进行松弛。

松弛完毕之后的dis数组为:

然后在剩下的3、5、6号顶点中,选出离1号顶点最近的顶点,这次选择3号顶点,此时dis3的值已经从“估计值”变为了“确定值”。对3号顶点的所有出边(3——>5)进行松弛。

松弛完毕之后的dis数组为:

继续在剩下的5号和6号顶点中,选出离1号顶点最近的顶点,这次选择5号顶点。此时dis[5]的值已经从“估计值”变为了“确定值”。对5号顶点的所有出边(5——>6)进行松弛,松弛之后更新的数组为:

最后对6号顶点的所有出边进行松弛,因为这个例子6号顶点没有出边,因此不用处理。到此,dis数组中所有的值都已经从“估计值”变为了“确定值”。

最终dis数组如下,这便是1号顶点到其余各个顶点的最短路径。

OK,算法的基本思想是:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点其余所有点的最短路径。基本步骤如下:

*1、 将所有的顶点为分为两部分:已知最短路程的顶点集合p和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合p中只有源点一个顶点。我们这里用一个book数组来记录那些点在集合p中。例如对于某个顶点i,如果book[i]为1则表示这个顶点在集合p中,如果book[i]=0则表示这个顶点在集合Q中。

2、 设置源点s到自己的最短路径为0即dis[s]=0。若存在有源点能直接到达的顶点i,则把dis[i]设为e[s][i]。同时把所有其它(源点不能直接到达的)顶点的最短路径设为∞。

3、 在集合Q的所有顶点中选择一个离源点s最近的顶点u(即dis[u]最小)加入到集合p。并考察所有以点u为起点的边,对每一条边进行松弛操作。例如存在一条从u到v的边,那么可以通过将边u——>v添加到尾部来拓展一条从s——>v的路径,这条路径的长度是dis[u]+e[u][v]。如果这个值比目前已知的dis[v]的值要小,我们可以用新值来替代当前的dis[v]中的值。

4、 重复第3步,如果集合为空,算法结束。最终dis数组中的值就是源点到所有顶点的最短路径。*
完整的Dijkstra算法代码如下:
可以输入以下数据进行验证。第一行两个整数n和m。n表示顶点个数,m表示边的条数。接下来m行,每行有3个数xyz,表示顶点x到顶点y边的权值z
n=6 m=9
x y z
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。因此在实际生活中应用相当广泛,大到国家各城市道路之间的道路网络建设,快递公司基于最短距离改进优化问题算法的物流配送系统,小到我们个人出行路线方案的选择。无论是个人还是公司,我们对Dijkstra算法思想的有意识应用,在解决单源路径问题上都给了我们新思路,提升了社会的运作效率。

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片:

带尺寸的图片:

居中的图片:

居中并且带尺寸的图片:

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目

    • 项目

      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N 是通过欧拉积分

Γ(z)=∫0∞tz−1e−tdt.\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞​tz−1e−tdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0开始我的操作确认?结束yesno
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

**Dijkstra算法**相关推荐

  1. [C] Dijkstra算法——通过边实现松弛

    Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...

  2. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  3. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  4. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  5. 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

    Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...

  6. 拿来就能用!Dijkstra 算法实现快递路径优化

    作者 | 李秋键 责编 | 伍杏玲 出品 | AI科技大本营(ID:rgznai100) 近几年来,快递行业发展迅猛,其中的程序设计涉及到运送路径的最优选择问题,下面我们尝试模拟实现快递路径优化问题, ...

  7. 基于Dijkstra算法的武汉地铁路径规划!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了 ...

  8. 【路径规划】Dijkstra算法——超详细原理图解

    Dijkstra算法详解 1. Dijkstra算法原理  1.1. 有向图的Dijkstra算法  1.2. 无向图和栅格网络的拓展   1.2.1. 无向图   1.2.2. 栅格网络 2. Di ...

  9. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  10. 【Dijkstra算法】未优化版+优先队列优化版

    https://blog.csdn.net/YF_Li123/article/details/74090301 Dijkstra算法伪代码://G为图:数组d为源点到达各点的最短路径长度,s为起点 D ...

最新文章

  1. java中字节输入流和输出流的简单使用例子
  2. Java ClassLoader详解
  3. 怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析
  4. AdaBoost算法详解与python实现
  5. 128位计算机 ps2,64位就最强?为啥没有128位电脑?
  6. desktop docker 无法卸载_Docker容器无法停止或移除-权限被拒绝错误
  7. python文本筛选html_python 正则表达式过滤文本中的html标签 源代码解析
  8. 训练日志 2019.1.31
  9. 在GitHub上删除项目后,在Android Studio上传项目依然提示project is already on github
  10. 【原】oracle external table
  11. java1乘到10000_你如何制作一个10000的数组,只有1-1000的值?
  12. 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
  13. svn汉化插件安装步骤
  14. 案例实践:零基础完成Loadrunner压力测试,十分钟教会你
  15. 根据身份证号判断年龄
  16. 重新认识融云,「不止即时通讯」
  17. 视频播放器(AVPlayer)
  18. Android圆形头像图Circle ImageView
  19. Pose for Everything: Towards Category-Agnostic Pose Estimation 阅读笔记
  20. element-ui dialog遮罩层在最上层,关掉dialog遮罩层还在

热门文章

  1. 用Remastersys定制自己的Ubuntu安装光盘
  2. Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?
  3. SublimeText3快捷键简要总结
  4. python小例子之8 -- decorator的使用
  5. 无法打开包括文件:“afxcontrolbars.h”
  6. 《图像理解理论与方法》(1)
  7. 修改linux环境变量配置文件
  8. 学习重要,还是学会学习重要
  9. ZF环境要求及如何配置
  10. windows--bat--右键菜单