关于弗洛伊德算法求最短路径详解
public class Test1 {
public static void main(String[] args) {
System.out.println("请输入有几个顶点:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
char[] vertex = new char[n];
System.out.println("请输入各个顶点的符号,每个字符用空格分隔:");
for (int i = 0; i < n; i++) {
vertex[i] = scanner.next().charAt(0);
}
int[][] arr = new int[n][n];
System.out.println("请输入各个顶点在二维表之间的距离,不能直达的用100表示:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = scanner.nextInt();
}
}
Graph gp = new Graph(vertex, arr, n);
gp.floyd();
gp.show(vertex);
}
}
//创建图
class Graph {
private char[] vertex;
private int[][] dis; // 从顶点出发到其他节点的距离
private int[][] pre; // 目标节点的前驱节点
// 顶点数组 邻接矩阵 长度大小
public Graph(char[] vertex, int[][] dis, int len) {
this.vertex = vertex;
this.dis = dis;
this.pre = new int[len][len];
// 对pre数组进行初始化
for (int i = 0; i < len; i++) {
Arrays.fill(pre[i], i);
}
}
public void show(char[] vertex) {
for (int i = 0; i < dis.length; i++) {
for (int j = 0; j < dis.length; j++) {
System.out.print(vertex[pre[i][j]] + " ");
}
System.out.println();
for (int j = 0; j < dis.length; j++) {
System.out.print("( " + vertex[i] + " -> " + vertex[j] + " 的最短路径 " + dis[i][j] + " ) ");
}
System.out.println();
}
}
// 弗洛伊德算法
public void floyd() {
int len = 0;
// 从中间节点进行遍历
for (int k = 0; k < dis.length; k++) {
// 对出发节点进行遍历
for (int i = 0; i < dis.length; i++) {
// 遍历终点节点
for (int j = 0; j < dis.length; j++) {
len = dis[i][k] + dis[k][j];
if (len < dis[i][j]) {
dis[i][j] = len;
pre[i][j] = pre[k][j];
}
}
}
}
}
}
- .NET Core系列之MemoryCache 初识
- 007手机一键Root(安机网一键Root) v3.0 官方最新版 一键ROOT您的Android手机
- 12306密码被盗了怎么办?12306密码外泄解决方法
- 12个字的qq网名
- 150M迷你型无线路由器怎么设置?
- 192.168.1.1打不开怎么办?路由器192.168.1.1打不开的原因以及解决办法
- 2011年电子报合订本 电子报 编辑部 中文 PDF版 [84M]
- 2015年1月15日小米新旗舰发布会现场图文直播
- 2016.3.1vivo Xplay5新品发布会现场视频直播 优酷直播
- 2016华为P9发布会视频直播地址 4月15日华为P9国行发布会直播