最短路径之Dijkstra算法

转载 2018年04月17日 14:56:46

最短路径之Dijkstra算法(看到i,j,k三个变量可以理解为需要三个for循环,方便记忆)

本节来学习指定一个点(源点)到其余各个顶点的最短路径,也称为”单源最短路径”。与上篇的Floyed-Warshall算法一样,这里仍然使用二维数组a来存储顶点之间边的关系。如图:(假设我要求的是1号顶点到其余顶点的最短距离) 
这里写图片描述
当然,我们还需要一个dis数组来存储1号顶点到其余顶点的当前距离,如图: 
这里写图片描述 
既然是求1号顶点到其余顶点的最短的距离,那么我们就从dis数组中找到一个距离1号顶点的最短距离的顶点。通过dis数组可知,当前距离一号顶点的最短的顶点为2号顶点。所以1号顶点到2号顶点的最短距离为2。为什么呢?因为距离都为整数,所以不可能找到第三个中转点使得1号顶点到2号顶点的距离最短了。只要从1号顶点到中转点,那么他们间的距离已经大于1号到2号顶点的距离了!(值得我们注意的是:并不是说之后只要从dis数组中找到最短的距离,那么就是1号顶点到该点的最短距离了) 
当前我们找到了1号顶点到2号顶点的最短距离为2,那么我们来看看2号顶点有哪些出边呢?由邻接矩阵我们可以知道,2号顶点的出边为3号和4号顶点,我们看看2—->3号这条边能否比直接从1—->3的距离变短呢?也就是说我们来比较dis[3]和a[2][3]+dis[2]谁大谁小。可以知道a[2][3]+dis[2]小于dis[3]所以我们更新当前1号到3号的距离,为5,同理,我们知道1—>4号的距离也可以缩小到8,所以,dis的数组变为: 
这里写图片描述

然后,我们继续找当前dis数组(除了2号顶点,因为我们已经找过了,所以在代码部分我们可以用一个数组来标记哪些点被找过了)距离1号顶点最短距离的顶点为5号顶点。然后我们看5号顶点有哪些出边,能否使得通过5号顶点使得某些点的距离变得更短。可以知道通过5号顶点可以使得1—>4号的距离缩短为5,1—->6号顶点的距离缩短为7。所以dis数组变为: 
这里写图片描述 
(5号顶点被用过了,我们就标记5号顶点) 
接下里我们从3,4,6号顶点找距离1号顶点最短的距离,当前为4号顶点,出边为4—>3,4—->6,没找到可以缩短的 
这里写图片描述 
继续从3,6找当前距离1号顶点最短的点为3,找3的出边,3—>5,dis[5]>a[3][5]+dis[3],没法缩短。 
这里写图片描述 
最后找到只剩下6这个顶点,没有出边。所以不dis不变 
这里写图片描述 
所以由dis数组可知,1号到1~6号的最短距离分别为,0,2,5,5,3,7

经典算法之图的最短路径(一):Dijkstra算法

Dijkstra算法可以说基本上每一本有讲到图的最短路径的书上都会有的一个算法,但基本上都是讲原理和伪代码,今天自己用Java代码给实现了一下,记录在此。 Dijkstra算法只是解决某些图的最短路径...
  • silent_strings
  • silent_strings
  • 2015-09-01 15:50:47
  • 2959

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

我们知道,Dijkstra是解决单源最短路问题的,并且最基本的算法仅能求出最短路的长度,而不能输出路径,本文基于Dinjkstra进行改进,使之能记录源点到任意点的所有最短路径。使用vector来记录...
  • xyt8023y
  • xyt8023y
  • 2015-05-29 13:16:03
  • 3403

单元Dijkstra算法求最短路径的的Java实现

上一篇写了无权值的最短路径的求法,是利用广度优先搜索的方法使用队列实现的,当有权值时,我们通常使用Dijkstra算法来求解最短路径的问题,这里我们假设所有的权值都是正值。 首先,在节点类改变了权值的...
  • qq_20991785
  • qq_20991785
  • 2015-03-17 11:08:21
  • 980

获取多条最短路径的Dijkstra算法

学习Dijkstra算法,并扩展成可以获取所有最短路径
  • u013615687
  • u013615687
  • 2017-04-04 14:43:24
  • 1584

最短路径—Dijkstra算法和Floyd算法(理解)

Floyd-Warshall——只有五行的算法 求任意两个点之间的最短路程。 从i号顶点到j号顶点只经过前k号顶点的最短路程,这是一种动态规划的思想。 for(k=1;k...
  • m0_37345402
  • m0_37345402
  • 2017-08-05 00:02:15
  • 1628

图算法 最短路径 Dijkstra算法

问题背景简介:   最短路径问题是图算法中一个典型和常用的应用问题。 例如,某一地区内有N个城市,给定了这N个城市间两两之间的距离,求解城市A 和 B之间的最短距离。   抽象为数学模型: ...
  • hyhyl1990
  • hyhyl1990
  • 2015-08-11 16:42:03
  • 1264

最短路径问题---Dijkstra算法详解

前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. ...
  • qq_35644234
  • qq_35644234
  • 2017-03-08 16:42:46
  • 58164

有向图最短路径问题---Dijkstra算法(过程)

有向图最短路径问题---Dijkstra算法(过程)
  • cjc211322
  • cjc211322
  • 2014-05-03 20:47:40
  • 6841

Dijkstra算法最短路径演示动画(数据结构)

  • a9529lty
  • a9529lty
  • 2009-04-03 13:44:00
  • 5975

最短路径之Dijkstra算法及实例分析

Dijkstra算法迪科斯彻算法 Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图。首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径。它的初始...
  • u010758724
  • u010758724
  • 2014-03-27 15:30:24
  • 5860
收藏助手
不良信息举报
您举报文章:最短路径之Dijkstra算法
举报原因:
原因补充:

(最多只允许输入30个字)