Dijkstra算法
代码中有详细解释,本算法实现采用的是邻接矩阵。
public class MatrixUDG {
static final int INF = Integer.MAX_VALUE;
static int[][] mMatrix;
static char[] mVexs;
/*public MatrixUDG(char[] mVexs,int[][] mMatrix) {
this.mVexs = mVexs;
this.mMatrix = mMatrix;
}*/
public static void dijkstra(int node, int[] dist) {
/*
* Dijkstra算法
* 参数说明:
* @ param node : 起点
* @ param dist : 长度数组,dist[i]表示从起点到i点的最短路径
*/
boolean[] flag = new boolean[mVexs.length];
//对所有顶点进行初始化
for (int i = 0; i < mVexs.length; i++) {
flag[i] = false;
dist[i] = mMatrix[node][i];
}
//对顶点node本身进行初始化
flag[node] = true;
dist[node] = 0;
//遍历mVexs.length - 1次,每次找出一个顶点的最短路径
int k = 0;
for (int i = 1; i < mVexs.length; i++) {
int min = INF;
//寻找最短路径
for (int j = 0; j < mVexs.length; j++) {
if (flag[j] == false && dist[j] < min) {
min = dist[j];
k = j;
}
}
flag[k] = true;
//更新mMatrix的值
for (int j = 0; j < mVexs.length; j++) {
int len = mMatrix[k][j] == INF ? INF : min + mMatrix[k][j];
if (flag[j] == false && len < dist[j]) {
dist[j] = len;
}
}
}
System.out.printf("dijkstra(%c) : \n", mVexs[node]);
for (int i = 0; i < mVexs.length; i++) {
System.out.printf("short(%c,%c) = %d\n", mVexs[node],mVexs[i], dist[i]);
}
}
public static void main (String[] args) {
mVexs = new char[]{'A', 'B', 'C', 'D'};
mMatrix = new int[][]{
{0, 1, 2, 1},
{INF, 0, INF, INF},
{INF, 3, 0, 1},
{INF, 1, 1, 0},
};
//MatrixUDG udg = new MatrixUDG(mVexs, mMatrix);
int[] dist = new int[mVexs.length];
dijkstra(2, dist);
}
}
时间复杂度:O(n2)