迪杰斯特拉(Dijkstra)算法最通俗易懂的讲解
一、问题定义
求解单元点的最短路径问题:给定带权有向图G和源点v,求v到G中其他顶点的最短路径
限制条件:图G中不存在负权值的边
二、思想
划重点,迪杰斯特拉最最朴素的思想就是按长度递增的次序产生最短路径。即每次对所有可见点的路径长度进行排序后,选择一条最短的路径,这条路径就是对应顶点到源点的最短路径。
Tips:可见点就是从源点开始按广度优先算法遍历顶点的过程中,搜索到的点。
下面来解释一下为什么源点到所有可见点的路径中长度最短的一条就一定是源点到该点的最短路径,会不会存在通过一些当前不可见的点间接到达该点的路径比它短呢?
我们设图G的顶点集合为V,再设一个集合S表示已求得最短路径的终点的集合(S怎么来的下面再说)。
设下一条最短路径(终点为x),那么它只能是弧(v,x)或者通过S中的顶点到达x即(v,vi,....,x)。我们来证明一下:
假设(v,...,x)路径上有一个顶点不在S中,则说明存在一条终点不在S中而长度比此路径还短的路径。但这是不可能的。因为我们按长度递增的顺序来产生各最短路径,所以长度比此路径还短的所有路径均已产生,他们的终点一定在S中。
三、算法
1.初始化。V为G中所有顶点集合,S={v}。D[x]表示从源点到x的已知路径,初始D[v]为0,其余为无穷大。
2.从源点v开始运行一步广度优先算法即找其相邻点。如下图中从源点0开始,找到的可见点为1,2,3.
3.计算可见点到源点v的路径长度,更新D[x]。然后对路径进行排序,选择最短的一条作为确定找到的最短路径,将其终点加入到S中,如此处找到的点为2,故将2加入S。S={v,2}.
4.从S中选择新加入的点运行广度优先算法找其相邻点,重复step3。直至所有点已加入S或者再搜索不到新的可见点(图中存在不联通的点,此时S<V)终止算法。
总结一下:
迪杰斯特拉算法总共就干了两件事:
【1】不断运行广度优先算法找可见点,计算可见点到源点的距离长度
【2】从当前已知的路径中选择长度最短的将其顶点加入S作为确定找到的最短路径的顶点。
python实现如下:
def dijkstra(graph,v0):vNum = graph.numNodepaths = {}count = 0cands = PQueue()cands.put((0,v0,v0)) #(pLen, u, vmin)表示经由u到vmin的已知最小路径长度为pLenwhile count < vNum and not cands.empty():pLen, u, vmin = cands.get() #取出可见点到源点中路径最短的一条,由优先队列实现if vmin in paths.keys():continuepaths[vmin] = (u,pLen) #v0到vmin的最小路径长度为pLen,其前驱为u,记住前驱是为了通过回溯还原路径for v,w in graph.getOutEdges(vmin): #找可见点if v not in paths.keys():cands.put((pLen + w,vmin,v)) count += 1return paths
完整代码https://download.csdn.net/download/goodxin_ie/11045007
迪杰斯特拉(Dijkstra)算法最通俗易懂的讲解相关推荐
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题
1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...
- java数据结构和算法——迪杰斯特拉(Dijkstra)算法
目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...
- 迪杰斯特拉(Dijkstra)算法解决最短路径问题
Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法
最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- java实现迪杰斯特拉(Dijkstra)算法求解最短路问题
迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...
- 数据结构——图——迪杰斯特拉(Dijkstra )算法
数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 7-2 公路村村通 迪杰斯特拉(dijkstra)算法
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...
最新文章
- FhqTreap的区间翻转
- 万万没想到! logger.info() 还能导致线上故障?
- oracle加as报错,【Oracle】-【sqlplus / as sysdba登录报错问题】-新用
- IEEE论文:城市大脑,基于互联网大脑模型的智慧城市建设
- 算法----删除链表中的节点(Java)
- Scala集合与Java集合的对比
- Python基础之二进制
- python爬取网易云音乐评论并进行可视化分析
- Error while compiling statement: FAILED: LockException [Error 10280]
- apscheduler mysql_APScheduler (重点)
- 面向接口编程的优点_为什么我们要面向接口编程
- excel服务器数据同步修改,勤哲Excel服务器同步解决海量数据快速上传问题
- Debug工具的使用
- FusionChartsFree在JSP中的用法
- 百数巡检领域系统能力展示
- 第五十三篇 三角函数公式大全
- Elasticsearch 聚合系列:adjacency matrix aggregation(邻接矩阵聚合)
- Maven setting文件配置错误:Non-parseable settings..in comment after two dashes (--) next character must be
- Python 判断无向图是否存在环
- 武汉大学计算机学院樊浩南,今年高考光荣榜?谁能告之??谢谢!!
热门文章
- 计算机毕业设计Java苹果酒店住房管理(源码+系统+mysql数据库+lw文档)
- 二进制和文本文件的比较
- 开源商城WSTMart支付开发研究[转]
- 基于Matlab人脸识别签到系统(GUI界面)
- oracle direct-load,sqlldr direct方式导致索引失效实测
- 【python教程入门学习】第一个Pygame程序
- ios 仿京东商品属性选择界面
- PYTHON对数值变量进行标准化,离散变量标签化
- java 包的位置_通过Java在jar文件所在的位置创建目录
- 关于test eax eax