Dijkstra算法的JAVA实现
import java.util.Arrays;
public class Dijkstra {
public static void main(String[] args) {
int min = 32767;
char[] vertexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int[][] matrix = {{0, 7, min, 5, min, min, min},
{7, 0, 8, 9, 7, min, min},
{min, 8, 0, min, 5, min, min},
{5, 9, min, 0, 15, 6, min},
{min, 7, 5, 15, 0, 8, 9},
{min, min, min, 6, 8, 0, 11},
{min, min, min, min, 9, 11, 0},};
Graph2 graph2 = new Graph2(vertexs, matrix);
graph2.showGraph();
Dj dj = new Dj();
dj.DijkstraDemo(vertexs, matrix, 1);
}
}
class Dj {
public void DijkstraDemo(char[] vertexs, int[][] matrix, int start) {
int n = matrix.length;
//保存起始点到
int[] bis = new int[n];
int[] isVisited = new int[n];
//记录最短路径的顶点
String[] path = new String[n];
//初始化标记路径
for (int i = 0; i < n; i++) {
path[i] = new String(vertexs[start] + "-->" + vertexs[i]);
}
//第一个顶点已经被访问
bis[start] = 0;
isVisited[start] = 1;
//执行n-1次,访问除原点外
for (int i = 1; i < n; i++) {
//当前尾部的路径下标
int u = -1;
//
int minDis = Integer.MAX_VALUE;
//找到当前原点到所有顶点的最短路径,并记录下标
for (int j = 0; j < n; j++) {
if (isVisited[j] == 0 && matrix[start][j] < minDis) {
minDis = matrix[start][j];
u = j;
}
}
//System.out.println("minDis=" + minDis);
//System.out.println("u=" + u);
//至此已更新了一个已确定节点及其最短距离
bis[u] = minDis;
isVisited[u] = 1;
//根据上一步骤选出的节点,向其他节点辐射更新距离
for (int k = 0; k < n; k++) {
//dis[u]+matrix[u][i]<matrix[start][i]
if (isVisited[k] == 0 && matrix[start][u] + matrix[u][k] < matrix[start][k]) {
matrix[start][k] = matrix[start][u] + matrix[u][k];
path[k] = path[u] + "-->" + vertexs[k];
}
}
}
for (int i = 0; i < n; i++) {
System.out.println(path[i] + "的最短路径" + bis[i]);
}
}
}
class Graph2 {
private char[] vertexs;
private int[][] matrix;
public Graph2(char[] vertexs, int[][] matrix) {
this.vertexs = vertexs;
this.matrix = matrix;
}
public void showGraph() {
for (int[] m : matrix) {
System.out.println(Arrays.toString(m));
}
}
}