Dijkstra算法实际上是一个贪婪算法(Greedy algorithm)。因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点。Dijkstra算法的过程如下图所示。

初始化

  1. 给定图中的一个结点s作为起始点。
  2. 给定一个数组dist[]存储图中所有结点到s的距离。将dist[s]初始化为0。对于图中的其他结点v,初始化dist[v]为无穷大。初始化为无穷大的意义在于我们假设其余所有结点在当前情况下尚未与s联通。随着算法的执行,dist[v]会保存图中从sv的最短路径的距离。
  3. 给定一个minimum Heap,记为Q。堆顶为当前情况下距离s最近的结点及相应的距离。将(s, 0)放入堆中。
  4. 给定一个Set,记为S,保存所有已经访问过的结点。Set初始为空。基于Dijkstra算法的性质,我们总是以最短的路径遍历每一个结点,因此对于任一结点,一旦我们已经访问过,就代表着我们已经得到了从s到达这一结点的最短路径。

计算最短路径

  1. Q不为空的情况下,取出堆顶的元素(v, [dist[v]) —— 也就是当前距离s最近的结点v,及其距离dist[v]
  2. 如果vS中,则代表我们已经访问过v的最短路径。那么跳过当前v,重复步骤1。
  3. 否则,将v放在S中。
  4. 对于每一个与v相邻的结点t
    • 如果dist[v] + weight(v, t) < dist[t],则更新dist[t] = dist[v] + weight(v, t)。同时将(t, dist[t])放进Q中。
    • 否则,不做任何处理。

当算法结束后,dist[]中保存图中每一个除s之外的结点到s的最短路径的权重值(或长度)。如果从sv不存在联通的路径,则dist[v] = ∞

证明算法正确性

假设对于每个已经访问过的结点vdist[v]存储从起始点sv的最短路径。

当算法初始化时,dist[]中只包含dist[s] = 0,其正确性显而易见。

对于其余n-1个结点,假设u已经被访问且v尚未被访问,同时uv之间存在一条边u -> v,其权重为weight(u,v),那么一定有dist[v] = dist[u] + weight(u, v)。否则的话,假设存在另一条更短的路径dist[t]满足dist[t] + weight(t, v),则根据上述算法,t一定先于u被访问,则与我们当前的假设产生了矛盾。该论断对于余下的所有结点都成立。

因此Dijkstra算法一定能给出从出发点到其余所有结点(在可以到达的情况下)的最短路径。

复杂度分析

设图中总计有E条边,N个结点。

时间复杂度:O(ElogE)。因为所使用的最小堆最大可达O(E)大小,同时我们从其中将每个元素取出来一次。

空间复杂度:O(N+E)。其中O(N)为存储dist所用空间。O(E)为存储图的邻接链表及最小堆所用空间。

『算法设计_伪代码』贪心算法_最短路径Dijkstra算法的更多相关文章

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

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

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

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

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

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

  4. 网络最短路径Dijkstra算法

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

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

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

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

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

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

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

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

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

  9. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

随机推荐

  1. (转载)WinCC 卸载后 Simatic Shell 的删除

    现象:WinCC卸载后,在计算机(我的电脑)中仍有Simatic Shell文件夹,双击无反应 解决:1.按Win+X,运行“regedit”,打开注册表2.在注册表中,选中HKEY_LOCAL_MA ...

  2. Centos7更改网卡名称Eth0并配置静态IP

    1.首先查看一下centos7的网卡名称 eno33554984 2.更改为centos7之前版本的网卡名称 3.更改网卡文件的名称 4.禁用可预测命名规则. 通过编辑 /etc/default/gr ...

  3. JS相关重点知识 (概况)

    1.value和innerHTML没有联系,只是value是表单的一个特有属性,而innerHTML是通用的. 2.当从外部引入js文件时,该外部文件里面可以有多个方法,   html页面中的oncl ...

  4. 解决:springmvc中接收date数据问题

    这里提供三种解决方案. 一.局部转换 :只是对当前Controller类有效 springMVC.xml中添加: <bean class="org.springframework.we ...

  5. 手把手教你学习R语言

    本文为带大家了解R语言以及分段式的步骤教程! 人们学习R语言时普遍存在缺乏系统学习方法的问题.学习者不知道从哪开始,如何进行,选择什么学习资源.虽然网络上有许多不错的免费学习资源,然而它们多过了头,反 ...

  6. 【BZOJ】1831: [AHOI2008]逆序对

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1831 考虑$-1$的位置上填写的数字一定是不降的. 令${f[i][j]}$表示$DP$到 ...

  7. VirtualBox-- 虚拟机网络设置2--主机与虚拟机互相访问且均上外网

    转载自:http://blog.sina.com.cn/s/blog_7de9d5d80100t2uw.html   VirtualBox中有4中网络连接方式:NATBridged AdapterIn ...

  8. pandas计数 value_counts()

    来自:曹骥 在pandas里面常用value_counts确认数据出现的频率. 1. Series 情况下: pandas 的 value_counts() 函数可以对Series里面的每个值进行计数 ...

  9. PostgreSQL安装及使用教程二(zip解压方式)

    下载postgre包  下载地址:https://www.postgresql.org/download/ 选DOWNLOADS--Windows--zip archive--version10.6- ...

  10. Android 关于虹软人脸识别SDK引擎使用总结

    虹软 最近开放了人脸识别的SDK引擎(免费的哦),刚好有Android版的,就体验了一波.下面来说说Android版的SDK使用心得: ArcFace 虹软人脸认知引擎简介 目前开放的版本有人脸比对( ...