1.1介绍
按理说迪杰斯特拉算法与普里姆算法不是一类东西,前者是最短路径算法,后者是最小生成树算法,为什么会放在一块呢?因为二者实在是太相似了。不管是从代码结构上以及分析方法上来说。对于我这种小白而言,看一百遍,合上书还是会忘了从哪开始编写代码。好在学了一些动态规划的东西,现在这两个算法从头写到尾是没有问题了。
下面使用的例子(图),出自程杰的《大话数据结构》,之前我也是在用这本书学习数据结构,也是朋友推荐我的,此书比较基础,没有讲到动态规划的东西。
写这两个算法还是比较简单的,这里记录的东西是我个人的推导思路以及想到的比较重要的点。有疑义的地方,可以去看看《大话数据结构》和《算法导论》的相关章节,一起学习进步。
1.2迪杰斯特拉算法
1.2.1分析
问题:如上图,以V0为起点求V0到各点的最短路径。
(1)动态规划的求解思路是,每次求得的最短路径的点是基于上次求得的最短路径的点,如V0到V2是在V0到V1的基础上得到的,所以每次都要选取V0所到路径最短的点来求解V0到下一个点的最短路径。当然,感觉这就跟没说一样。
(2)思路是这样,代码如何构建呢?首先需要一个邻接矩阵MGraph来存储这张图。
(3)此处是起点V0点,无论起点是哪个都是一样的道理。那么就用起点V0来初始化。创建一个数组ShortPathTable来存储V0到各点的最短路径值,也就是循环ShortPathTable[i]=MGraph[0][i]。一开始,V0只能到V1,V2所以该数组的值就是{0,1,3,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY},INFINITY为无限大。
(4)基于思路(1),利用循环,从ShortPathTable(因为它存储V0到各点的最短路径值)中找一个路径值最短的点,此处也就是V1。
(5)此时V0通过V1就可到达V