一、什么是迪杰斯特拉算法
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
二、具体应用解题
相信看了上面的概念,大家还是啥也不知道(我也一样,这种科学文献的定义简直就是现代文言文,关键在文言文你搞懂句式和字的古义就行,科学定义看半天也搞不明白在说啥。)所以我下面用一个例子来说明一下。
简单来说,这个算法就是用来求从一个图中任意一个结点到另一个结点最短路径的算法。
以上图为例,求从a点出发到其余每个结点的最短路径。
首先我们设两个集合,集合A用来存放已经找到最短路径的结点,集合B用来存放未找到最短路径的结点。
第一轮
初始状态:
A=∅,B={a,b,c,d,e,f,g}
列表(表中显示各结点当前到a的距离)
a | b | c | d | e | f | g |
0 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ |
此时集合A中没有任何结点,只有a自己能到自己,距离为0,距离最短,将结点a加入集合A。
结束状态:
A={a},B={b,c,d,e,f,g}
第二轮
第二轮的初始状态即为第一轮的结束状态,以此类推。
b | c | d | e | f | g |
15 | 2 | 12 | ∞ | ∞ | ∞ |
此时集合A中有a,所以可以通过a到达a的邻接结点,即b,c,d,其中到c距离最短,故a到c的最短路径即为a->c,将c加入A中。
A={a,c},B={b,d,e,f,g}
第三轮
b | d | e | f | g |
15 | 12 | 10 | 6 | ∞ |
{c} | {c} |
选出f加入A中
A={a,c,f},B={b,d,e,g}
第四轮
b | d | e | g |
15 | 11 | 10 | 16 |
{c,f} | {c} | {c,f} |
注意之前d到a的距离是12,这里变成了11,因为之前的路径是a->d,而上一轮f加入了A中,所以路径a->c->f->d就走的通了,这条路径更短。
A={a,c,e,f},B={b,d,g}
第五轮
b | d | g |
15 | 11 | 16 |
{c,f} | {c,f} |
选出d
A={a,c,d,e,f},B={b,g}
第六轮
b | g |
15 | 14 |
{c,f,d} |
A={a,c,d,e,f,g},B={b}
第七轮
b |
15 |
A={a,b,c,d,e,f,g},B=∅
至此全部找到
总表如下
a | b | c | d | e | f | g | A | |
第一轮 | 0 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | {a} |
第二轮 | - | 15 | 2 | 12 | ∞ | ∞ | ∞ | {a,c} |
第三轮 | - | 15 | - | 12 | 10 | 6 | ∞ | {a,c,f} |
{c} | {c} | |||||||
第四轮 | - | 15 | - | 11 | 10 | - | 16 | {a,c,e,f} |
{c,f} | {c} | - | {c,f} | |||||
第五轮 | - | 15 | - | 11 | - | - | 16 | {a,c,d,e,f} |
{c,f} | {c,f} | |||||||
第六轮 | - | 15 | - | - | - | - | 14 | {a,c,d,e,f,g} |
{c,f,d} | ||||||||
第七轮 | - | 15 | - | - | - | - | - | {a,b,c,d,e,f,g} |
所以,各点最短路径为
b:a->b;
c:a->c;
d:a->c->f->d;
e:a->e;
f:a->c->f;
g:a->c->f->d->g;
有朋友可能觉得为什么a->b这么显而易见却最后才找出来,这个显而易见是我们人的大脑自动分析的,你按照这个算法来他就是最后才确定,因为刚好前面每次找到的路径都比他短,你不到后面不能确定他是最短路径的,比如说中间就有两次发生了变化,当有一些结点没有加入时,可能还会有更短的路径,大家不要想当然,还是按照程序来吧。
总结
讲了这么多,也不知道大家理解了没有,今天做题的时候遇到了这个题,我在网上找了一下资料,发现讲的确实很详细,不过对于初学者来说可能还是有些晦涩了,正好巩固一下,我写了这篇文章,希望能对大家有所帮助。