目录
概述
代码实现
public class FloydAlgorithm {
public static void main(String[] args) {
// 测试看看图是否创建成功
char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
//创建邻接矩阵
int[][] matrix = new int[vertex.length][vertex.length];
final int N = 65535;
matrix[0] = new int[] { 0, 5, 7, N, N, N, 2 };
matrix[1] = new int[] { 5, 0, N, 9, N, N, 3 };
matrix[2] = new int[] { 7, N, 0, N, 8, N, N };
matrix[3] = new int[] { N, 9, N, 0, N, 4, N };
matrix[4] = new int[] { N, N, 8, N, 0, 5, 4 };
matrix[5] = new int[] { N, N, N, 4, 5, 0, 6 };
matrix[6] = new int[] { 2, 3, N, N, 4, 6, 0 };
//创建 Graph 对象
Graph graph = new Graph(vertex.length, vertex, matrix);
//调用弗洛伊德算法
graph.floyd();
graph.show();
}
}
class Graph{
char[] vertexs; // 节点名称
int[][] dis; // 节点间距离
int[][] pre; // 每个节点的前驱节点
public Graph(int length, char[] vertexs, int[][] dis) {
this.vertexs = vertexs;
this.dis = dis;
this.pre = new int[length][length];
// 初始化前驱节点, 默认每个节点前驱都是其本身
int i = 0;
for (int[] pres : pre) {
Arrays.fill(pres, i++);
}
}
// 显示pre数组和dis数组
public void show() {
//为了显示便于阅读,我们优化一下输出
for (int k = 0; k < dis.length; k++) {
// 先将pre数组输出的一行
for (int i = 0; i < dis.length; i++) {
System.out.print(vertexs[pre[k][i]] + " ");
}
System.out.println();
// 输出dis数组的一行数据
for (int i = 0; i < dis.length; i++) {
System.out.print("("+vertexs[k]+"到"+vertexs[i]+"的最短路径是" + dis[k][i] + ") ");
}
System.out.println();
System.out.println();
}
}
/**
* 算法实现
*/
public void floyd() {
int len = 0; // 用于保存最短的路径长度
// 遍历中间节点
for (int center = 0; center < vertexs.length; center++) {
// 遍历起点节点
for (int begin = 0; begin < vertexs.length; begin++) {
// 遍历结尾节点
for (int end = 0; end < vertexs.length; end++) {
// 起点到终点长度
// 等于 经过中间节点 和 直接到达 比较后其中较小的值
len = dis[begin][center] + dis[center][end];
if(len < dis[begin][end]){
// 修改最短路径
dis[begin][end] = len;
// 修改中间节点
pre[begin][end] = center;
}
}
}
}
}
}