【Dijkstra】
理解部分:此算法的目的,就是找出任意两点之间的最短路径,假定我们选择A点为定点,将A点的状态设置为已遍历,此时并不知道A点与其他点的最短路径是多少,因此我们将A点与各点的最短路径设置为无穷大,之后从未经遍历的点&&目前正处在的点(也就是A点)的邻点(若有多个邻点则选择距离较近的点) 开始遍历,每遍历一个点就记录下A点与此点的距离,若小于目前的最短路径则更新最短路径并将此点的状态设置为已遍历,这样就可以遍历所有的点并记录任意两点之间的最短路径
感想:Dijkstra是一种贪心算法,每一次步骤都是选出与已经访问过的节点距离最短的节点,过程则是不断地去重复这个步骤
【Floyd】
理解部分:与Dijkstra算法目的一样,都是求任意两点之间的最短路径,采用动态规划的方法,初始建立n阶矩阵,以Aij 来表示 i点和j点之间的距离,之后进行n次迭代**Aij = min(Aij,Aik+Aki)(k = 1,2,3,…,n)**此时k可理解为ij穿过的节点
感想:虽然与Dijkstra的时间复杂度相同都是O(n3),但Floyd算法实现的过程所需的运算量更小不用像Dijkstra算法一样一个个假定定点一个一个来,而是同时一次性全部求出来
【Prime】
理解部分:任意找1个节点,将该节点的状态设置为已遍历,寻找与该节点共边的最小的节点,将该节状态设置为已遍历,并记录下2节点的距离,之后在两节点中寻找共边的距离最小的未遍历节点,找到第三节点,将该节点状态设置为已遍历的状态,并记录距离,直到所有节点遍历完成,将记录下来的距离累加即得到最小生成树
【Kruskal】
理解部分:从最小的边开始,记录下最小的边的距离,并将边上的点状态设置为已遍历,之后寻找第二小的边,判断该边上是否存在已遍历的点,若没有,则将该边上的点设置为已遍历,记录边距离,重复该步骤直至所有节点均以被遍历
感想:两种算法的区别为一个从点的角度运算,一个从边开始运算,当遇到边多的时候则时候用prime,边少的情况下时候用Kruskal