Floyd和Dijkstra算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法,不同点在于Floyd算法求加权图中所有顶点之间的最短路径; Dijkstra算法在求一点到其他所有顶点的最短路径
Dijkstra算法:
依次求距离源点的最短路径,再求还不确定的最小权值时(再求还未确定的顶点),就是从最后确定的最新权值的基础上(从那个顶点出发)遍历与他相连的边,在所有还未确定的顶点中找出最小的权值,即是确定下新的最短路径(最新顶点)
1.假设从D点开始,D为起始点,Visited[D] = 0 遍历与D相连的所有点,发现E最短,但D到BCF的距离也保留下来,保存在一个Visited数组里,E保存在S集合中,表示确定下来的顶点.
2.因为E与D距离最近,第二点从E开始,遍历E,CE为4,EF为5,所以计算D到F距离为6,比3大,所以保留3(如果新计算的权值大于原有的距离,保留新的权值),同理保留DF的3,ED的2因为visited[D] 已经确定下来 ,也因为 visited[D] = 0, visited[E] + 2 肯定>0 ,所以2无效的, S集合确定下来的顶点不用去遍历了,当然遍历了也没有关系,只是增加了运算的时间
3.确定了DC最近,下一个顶点就从C点出发,遍历C的所有顶点
我们是从原先顶点遍历中找出最短的权值,再与之前的还没确定下来的距离相比,找出最短的距离,确定最新