迪杰斯特拉算法
思想:先找到所有点中路径最小的,再以路径最小的点作为中转站,遍历在当前已经查找到的基础上的查找更小的路径
// 最短路径算法
// 可以使用一个三角形形式进行记忆
public class ShortestPath {
public static int INF = Integer.MAX_VALUE;
// param
// @adjMatrix:邻接矩阵
// @v0:查找v0到各个点的最短路径
public static int[] dijkstra(int[][] adjMatrix,int v0){
int vnum = adjMatrix.length;
int[] p = new int[vnum];// 前驱结点
int[] distance = new int[vnum];// 最短路径
boolean[] flag = new boolean[vnum];// 已经查找到最短路径的结点
// 初始化
for (int i=0;i<vnum;i++){
flag[i] = false;
distance[i] = adjMatrix[v0][i];
p[i] = v0;// 初始前驱都为v0
}
flag[v0] = true;
distance[v0] = 0;
// 每次查找1个顶点的最短路径
// 排除顶点v0共i-1次
int min = INF;
int k = 0;
for(int i=1;i<vnum;i++){
// 查找当前最短路径
for (int w=0;w<vnum;w++){
if (!flag[w]&&distance[w]<min){
k = w;
min = distance[w];
}
}
flag[k] = true;// 顶点k查找到
// 修正最短路径
for (int w=0;w<vnum;w++){
if (!flag[w]&&min+adjMatrix[k][w]<distance[w]){
distance[w] = min + adjMatrix[k][w];
p[w] = k;
}
}
}
return p;
}
}
弗洛伊德算法
求任意两点之间的最短路径
参考
https://www.cnblogs.com/wangyuliang/p/9216365.html
// 弗洛伊德算法
public static int[][] floyd(int[][] adjMatrix){
int vnum = adjMatrix.length;
for (int k=0;k<vnum;k++){
for (int i=0;i<vnum;i++){
for (int j=0;j<vnum;j++){
if (adjMatrix[i][j]>adjMatrix[i][k]+adjMatrix[k][j]){
adjMatrix[i][j] = adjMatrix[i][k] + adjMatrix[k][j];
}
}
}
}
for (int i=0;i<vnum;i++){
for(int j=0;j<vnum;j++){
System.out.print(adjMatrix[i][j]+" ");
}
System.out.println(" ");
}
return adjMatrix;
}