介绍
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层扩展(广度优先思想),直到扩展到终点为止。
算法过程
设置出发顶点为v,顶点集合V{v1,v1,vi…},v到V中各顶点的距离构成集合Dis,
Dis(d1,d2,di),Dis集合记录v到图中各顶点的距离(自身可以看作0,v到vi的距离对应di)
1、从Dis中选择值最小的di并移出Dis集合,同时移出V集合中对应的顶点vi,此时,v到vi即为最短路径
2、更新Dis集合,更新规则为:比较v到V集合中顶点的距离值,与v到vi到集合中顶点的距离值,保留值比较小的一个
3、重复执行这两个步骤,直到最短路径顶点为目标顶点即可结束。
最短路径的应用
有七个村庄(A,B,C,D,E,F,G),现在有六个邮差,从G点出发,需要分别送到A,B,C,D,E,F六个村庄,各个村庄的距离用边线表示(权),如何计算出G村庄到各个村庄的最短距离?如果从其他出发点到各个村庄的最短距离又是多少?
package algorithm;
/**
* @author taoke
* @desc 迪杰斯特拉算法(最短路径问题)
* @email 1504806660@qq.com
* @date 2022/1/26
*/
public class Dijkstra {
//最大值
private static final int N = 65535;
//顶点
private static final char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
//邻接矩阵
private static final int[][] matrix = {
{0, 5, 7, N, N, N, 2},
{5, 0, N, 9, N, N, 3},
{7, N, 0, N, 8, N, N},
{N, 9, N, 0, N, 4, N},
{N, N, 8, N, 0, 5, 4},
{N, N, N, 4, 5, 0, 6},
{2, 3, N, N, 4, 6, 0}
};
public static void main(String[] args) {
//起点位置
int start = 6;
djs(start);
show(start);
}
/**
* 迪杰斯特拉算法
*
* @param index 是
*/
public static void djs(int index) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
if (matrix[index][i] + matrix[i][j] < matrix[index][j]) {
matrix[index][j] = matrix[index][i] + matrix[i][j];
}
}
}
}
/**
* 打印结果
*
* @param index 起点索引
*/
public static void show(int index) {
System.out.println("最短路径:");
for (int i = 0; i < matrix.length; i++) {
System.out.print(vertex[index] + " -> " + vertex[i] + " = " + matrix[index][i] + "\n");
}
}
}