dijkstra算法介绍:即迪杰斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先的搜索方法。

dijkstra算法原理:最优子路径存在。假设从S→E存在一条最短路径SE,且该路径经过点A,那么可以确定SA子路径一定是S→A的最短路径。证明:反证法。如果子路径SA不是最短的,那么就必然存在一条更短的'SA,从而SE路径也就不是最短,与原假设矛盾。

dijkstra算法缺点:与此前说过的viterbi不同,此算法能够求出从起点到其余每个结点的最短路径,所以需要遍历所有的路径和结点,计算复杂度比较大。

dijkstra算法例子:求从结点0到各个结点的最短路径。

 
 

step1:首先建立两个集合S={}:表示已经找到最短路径的结点;U={}:表示尚未找到最短路径的结点。显然,S与U互为补集,S U U=所有结点组成的集合,当U为空的时候算法结束,所有结点最短路径均已找到。

step2:建立一个数组dist[i],用于存放起点0到该结点i的最短路径(可能需要更新,接下来会解释)。然后再建立一个布尔数组s[i](初值均为0),用于表示该结点是否已经找到最短路径,如已经找到便不再遍历。

step3:具体执行部分:

A:
初始点设定。
对于结点0,首先将其纳入到S集合中,然后寻找并计算与结点0直接相连路径的长度,即dist[1]=100,dist[30]=2,dist[4]=10(这时dist[0]=0)。而不能直接到达的结点距离为无限大∞。这里使用dist[3]=99999,方便程序比较大小。然后使s[0]=1,表示已经遍历过该结点。

B:选取最小dist[i]。比较dist[1],dist[3],dist[4]的长度,选择长度最短的dist[4],并将结点4纳入到S集合中,令s[4]=1,表明0到4的最短路径已经找到,且值为10。原因:最优子路径存在原理。由于dist[1],dist[3]均大于dist[4],所以若选择走经过结点1、3到达结点4路径,无论如何也不可能找到一条小于直接从结点0到结点4的路径!这个结论非常非常非常重要,是理解这个算法的关键!后面会反复用到,每一轮循环都要比较并选取最小的dist[i]。

C:更新dist[i]。现在,我们开始以结点4为中心向外扩展(广度优先)。现在,结点4可以到达结点3了,也表明从结点0可以通过结点4到达结点3了。至于要更新dist[i]的原因如下图:

在第一次选择中,我们纳入了起点A,然后由于dist[C]=6<dist[B]=20,我们又纳入了C点。这时,我们发现我们还可以通过C点到达B点,所以我们必须比较dist[B]与dist[C]+|CB|的大小。这以下这个例子中,显然6+7=13<20,所以dist[B]需要从20更新成13。所以,我们不难发现:每纳入一个新的结点,我们都需要比较由这个结点新扩展出来结点所生成路径与原来路径的长度。

 
 

step4:重复上述步骤B、C,直到U集合清空,s[i]中所有值均为1。这就表明图中所有点都找到了最短路径。

下面放出以上例子的步骤表,如果能理解就表明基本了解dijkstra算法的思想了。

 
 

最后,从结点0到各个点的最短路径就都算出来了。

dijkstra算法重点:理解为何需要选取最小的dist[i];理解为何需要更新dist[i]。

作者:俊爷拒做学渣
链接:https://www.jianshu.com/p/c9b27617502e

dijkstra算法:寻找到全图各点的最短路径的更多相关文章

  1. 利用Dijkstra算法实现记录每个结点的所有最短路径

    最近在做PAT时发现图论的一些题目需要对多条最短路径进行筛选,一个直接的解决办法是在发现最短路径的时候就进行判断,选出是否更换路径:另一个通用的方法是先把所有的最短路径记录下来,然后逐个判断.前者具有 ...

  2. Dijkstra算法模拟讲解

    dijkstra算法,是一个求单源最短路径算法 其算法的特点为: 层层逼进,有点类似宽度搜索的感觉 其需要的数据结构为:                  int map[N][N] 所有点之间的权表 ...

  3. [MIT6.006] 18. Speeding up Dijkstra 加速Dijkstra算法

    在之前的课我们讲过了Dijkstra算法,先回顾下,如下图: 那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)和目标方向 ...

  4. Dijkstra算法为什么权值不能为负

    Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U),归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记 ...

  5. Dijkstra算法(迪杰斯塔拉算法)

    算法描述: Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最 ...

  6. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  7. 最短路径(Dijkstra算法)

    当用图结构来表示通信.交通等网络,权重代表距离或者成本,寻找最短路径就成为了一个重要的任务. 给定带权网络G=(V;E),源点s,对于其他所有顶点v,寻找s到v的最短路径,连接成一颗最短路径树.可以证 ...

  8. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  9. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

随机推荐

  1. MySql下视图的创建

     (1).第一类:create view v as select * from table; (2).第二类:create view v as select id,name,age from ta ...

  2. 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...

  3. PHP解决中文乱码问题

    初学PHP,在汉字页面间传输和转换的时候,遇到了中文乱码问题. 究其原因乱码无外乎以下几种情况: 1.html页本身的乱码问题, 解决方法:纯html页使用<meta http-equiv=&q ...

  4. spring struts2 ibatis 框架结构图

    spring struts2 ibatis 框架结构图

  5. C++ Primer 有感(标准库vector及迭代器)

    vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...

  6. /sbin/insserv: No such file or directory

    /sbin/insserv: No such file or directory在Ubuntu下安装service服务,可能会报如下错误:/sbin/insserv: No such file or ...

  7. 使用CocoaPods创建Pod

    本来想给App评分,好的开源组件没有Swift版,如是自己写了个简易的.想着既然写了,就写完善点,提供给需要的人使用.这样SwiftyiRate诞生了. 下面主要说下创建pod的步骤: 一.创建git ...

  8. XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)

    前文分析了XBMC的基本结构: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分 ...

  9. Linux进程-命令行参数和环境列表

    命令行参数 在C中,main函数有很多的变种,比如 main(), int main(), int main(int argc, char *argv[]), int main(int argc, c ...

  10. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十)

    下面修改最为关键的matchRun方法里的代码: CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{ _finishedCou ...