Dijkstra的用途:
-
Dijkstra是一个求单源最短路径的算法。
-
"单源最短路径",顾名思义,从一个源头到其他结点的最短路径。而这个算法,可以求出单个点对其他所有点的最短路径长度。(有些情况是Dijkstra不能处理的,比如负边权,遇到这类情况可能就需要使用其他算法了)
Dijkstra的思想:
-
主要思想:
-
从源结点开始,遍历源结点的所有连接的边,并进行排序,再从边的值最小的一个边开始遍历,在每一次遍历的过程中,都尝试更新所储存的某个结点对于源结点的最短路径长度(假设我们要到点B,目前我们遍历到了点A,如果点A到点B的距离加上点A到源点的距离比目前我们之前存储的 源点到点B的距离短的话,就更新源点到点B的最短路径,并在之后遍历连着点B的点(也就是进行BFS))。
-
例子:
-
首先,从源结点开始进行BFS(也就是遍历到达的点所向外连着的点.比如A->B B->A A->C(A连B,B连A,A连C),那么BFS A结点就是B C)
-
在BFS的过程中,每到一个点,就比较一下从 源头到这个点的路径长度 和 之前求的从源头到这个点的最短路径的长度 大小,如果现在这个路径长度比较小,就存起来
Dijkstra的实现方法:
- 首先,存图(使用邻接表或链式前向星(如果不会存图建议先学存图,因为这里不会讲怎么存图和BFS)).
- 算法运行过程:
- 把数据(也就是dis数组)初始化为INF(为什么要这样做?这是因为我们要使用较小的值不停更新它,这样最终就是源点到这个点的最小值了。那怎么知道某个点所对应的与源点的距离呢?一般是把源点的序号当做数组的下标。下标是什么意思呢?比如使用这个代码:int i=A[10],10就是数组A的一个下标。源点的序号是什么意思呢?一般使用源点读入的顺序当做源点的序号)
- 准备一个优先队列,用于之后进行的BFS.
- 在BFS