最近由于科研项目需要深入理解Dijkstra算法,发现该算法虽然之前看过两遍但还是没有彻底理解,今天来详细解析一下,并用Java实现。
Dijkstra算法求解的是加权连通简单图中一个顶点到其他每个顶点的具有最小权和的有向路径。最简单版本的时间复杂度为O(n^2),是多项式时间算法。该算法是利用了一种广度优先搜索的思想,从起始点开始逐个向外扩散直到遍历完所有节点。
该算法主要分为以下四步:
0. 需要引进两个集合S和U,S的作用是记录已经求出最短路径的顶点以及相应的最短路径长度,U的作用是记录还未求出最短路径的顶点以及该顶点到起始点的距离。
- 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为起点s到该顶点的距离,如果这两点之间没有直接路径,则距离为无穷大;
- 从U中选出“距离最短的顶点k”,并将顶点k加入到S中,同时从U中移除顶点k;
- 利用k更新U中各个顶点到起点s的距离,因为(s,v)的距离可能大于(s,k)+(k,v)的距离;
- 重复步骤2、3,直到U为空。
在Java实现中,使用图的邻接矩阵存储结构,需要两个数组,一个一维数组存储图中的顶点信息,一个二维数组存储图中边的信息。
public class MatrixUDG {
private int mEdgNum;// the number of edge
private char[] mVexs;// the number of vertex
private int[][] mMatrix;// adjacency matrix
private static final int INF &