Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径。
Dijkstra 算法采用贪心算法(Greedy Algorithm)范式进行设计。
Dijkstra 算法描述:
1. 设计合适的数据结构。设置带权邻接矩阵C,设源点为u,x为源点外任意顶点,即如果<u,x>∈E,令C[u] [x]等于<u,x>的权值,否则,C[u] [x]=0;采用一维数组dist来记录从源点到其他顶点的最短路径长度,如dist[x] 表示从源点到顶点x的路径长度,采用一维数组p来记录最短路径。
2. 初始化。令集合S = { u },对于集合V-S中的所有顶点x,设置dist[ x ] = C [ u ] [ x ](x主要只是一个符号,它可以表示集合V-S中的任一个顶点);如果顶点i与源点相邻,设置p[ i ] = u,否则p[ i ] = -1。
3. 在集合V-S中依照贪心策略来寻找使得dist[ x ] 具有最小值的顶点t,即dist[ t ] = min { dist[ x ] | x∈(V-S) },满足该公式的顶点t就是集合V-S中距离源点u最近的顶点。
4. 将顶点t加入集合S中,同时更新集合V-S。
5. 如果集合V-S为空,算法结束;否则,转步骤6。
6. 对集合V-S中的所有与顶点t相邻的顶点x,如果dist[ x ] > dist[ t ] + C [ t ] [ x ],则dist[ x ] = dist[ t ] + C [ t ] [ x ]并设置p[ i ] = t。转步骤3。
该算法过程比较简单,很好理解。接下来我们来看一个实际例子,下面的动图很好解释了算法的过程。