迪杰斯特算法求最短路径
package algorithms;
import java.util.Arrays;
/**
* @date 2021/3/31 8:32
*/
public class DJS {
private char[] vertex;
private int[][] matrix;
private final static int N = 10000;
public DJS(char[] vertex, int[][] matrix) {
this.vertex = vertex;
this.matrix = matrix;
}
public void djs(int index) {
int[] dis = new int[vertex.length];
String[] path = new String[vertex.length];
int[] state = new int[vertex.length];
for (int j = 0; j < vertex.length; j++) {
dis[j] = matrix[index][j];
path[j] = vertex[index] + "=>" + vertex[j];
}
dis[index] = 0;
state[index] = 1;
for (int k = 1; k < vertex.length; k++) {
int minDis = N;
int minIndex = 0;
for (int i = 0; i < vertex.length; i++) {
if (state[i] == 0 && minDis > dis[i]) {
minDis = dis[i];
minIndex = i;
}
}
for (int i = 0; i < vertex.length; i++) {
if (state[i] == 0 && matrix[minIndex][i] + minDis < dis[i]) {
dis[i] = matrix[minIndex][i] + minDis;
path[i] = path[minIndex] + "=>" + vertex[i];
}
}
state[minIndex] = 1;
}
System.out.println(Arrays.toString(dis));
for (String element : path){
System.out.println(element);
}
}
public static void main(String[] args) {
char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int[][] matrix = {
{N, 5, 7, N, N, N, 2},//第一行A和另外顶点的边的权值,N代表没有联通
{5, N, N, 9, N, N, 3},//第二行B和另外顶点的边的权值,N代表没有联通
{7, N, N, N, 8, N, N},//第三行
{N, 9, N, N, N, 4, N},//...
{N, N, 8, N, N, 5, 4},
{N, N, N, 4, 5, N, 6},
{2, 3, N, N, 4, 6, N},
};
DJS djs = new DJS(vertex, matrix);
djs.djs(6);
}
}
分析如下:
/**
* @param index 要求的结点,以这个结点为开始结点,求它和其它结点的最短路径
*int[][] matrix = {
* {N, 5, 7, N, N, N, 2},//第一行A和另外顶点的边的权值,N代表没有联通
* {5, N, N, 9, N, N, 3},//第二行B和另外顶点的边的权值,N代表没有联通
* {7, N, N, N, 8, N, N},//第三行
* {N, 9, N, N, N, 4, N},//...
* {N, N, 8, N, N, 5, 4},
* {N, N, N, 4, 5, N, 6},
* {2, 3, N, N, 4, 6, N},
* };
*
* 以G为起点,求G到其他各点的最短距离
* 第1次:选出G
* S={G(0)}
* U={A(2)、B(3)、C(N)、D(N)、E(4)、F(6)}
* 第2次:选出A
* S={G(0)、A(2)}
* U={B(3)、C(9)、D(N)、E(4)、F(6)}
* 第3次:选出B
* S={G(0)、A(2)、B(3)}
* U={C(9)、D(12)、E(4)、F(6)}
* 第4次:选出E
* S={G(0)、A(2)、B(3)、E(4)}
* U={C(9)、D(12)、F(6)}
* 第5次:选出F
* S={G(0)、A(2)、B(3)、E(4)、F(6)}
* U={C(9)、D(10)}
* 第6次:选出C
* S={G(0)、A(2)、B(3)、E(4)、F(6)、C(9)}
* U={D(10)}
* 第7次:选出D
* S={G(0)、A(2)、B(3)、E(4)、F(6)、C(9)、D(10)}
*
* 最终得到的到各顶点的最短路径就是{2,3,9,10,4,6,0}
*/