算法简介
不要当背景故事跳过了哦
01
迪杰斯特拉算法是典型的最短路径的算法,由荷兰计算机科学家迪杰斯特拉于1959年提出,用来求得从起始点到其他所有点最短路径。
该算法采用了贪心的思想,每次都查找与该点距离最近的点(也因为这样,它不能用来解决存在负权边的图)。
解决的问题可描述为:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点vs到其余各点的最短路径。
02
基本思路
开始迷茫
贰
假装是一个标题
假装是一个没有灵魂的副标题
我们所需要考虑的点有两种,一种是已经计算过的点,一种是未计算过的点,并且还要储存顶点到他们的最短距离。
以下图为例,先设立两个集合S和U,S中包含以计算的点与到此点的最短距离,U中包含未计算的点以及该点到顶点的距离。设定A的出边临界点距离为原值,不是的为无穷大。
开始运算时,S中只包含了顶点(下图中的A),而U中包含了剩余未计算的点(下图中A以外的点)。然后开始进行运算,先以A为中心点开始寻找,在U中找到A的出边临界点(B和C),并计算他们与A的距离,将距离最短的点(C)从U集合取出放入S集合中,并更新S中A到各点的最短距离,再以上一个被取到S的点(C)作为中心点,重复进行上一步操作,直到U中没有点元素。
算法步骤
彻底失智
03
还是以那个无向图为例
a.初始时,S只包含源点,即S={vs},vs的距离为0。U包含除vs外的其他顶点,即U={其余顶点},若u不是vs的出边邻接点,则权值为∞;
b.从U中选取一个距离vs最小的顶点k,把k加入S中(该选定的距离就是vs到k的最短路径长度min);以k为新考虑的中间点,修改U中各顶点的距离;若从源点vs到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,即dist[u] = min( dist[u], min + w[k][u] );
c.重复步骤b和c直到所有顶点都包含在S中。
迪杰斯特拉算法是很基础但也很重要的一种算法,例如著名的A*算法便是迪杰斯特拉算法的延伸,所以此算法的重要性不言而喻,希望各位小伙伴们都会认真学习下这个算法(虽然大家可能已经都会了)!
参考链接:https://www.cnblogs.com/21207-iHome/p/6048969.html