最短路径Dijkstra的思想我就不写了,大家自己在网上看吧。我直接上代码了。
public static void main(String[] args) {
System.out.println("请输入节点数");
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
// 创建一个领结矩阵数组
int[][] arr = makeArr(count);
// 创建三个数组并且初始化
List<Integer> s = new ArrayList<>();
s.add(0);
int[] v = new int[count - 1];
for (int i = 1; i < count; i++) {
v[i - 1] = i;
}
int[] dist = new int[count];
dist[0] = 0;
for (int i = 1; i < count; i++) {
dist[i] = -1;
}
//创建一个字符数组存放点
String[] dit = new String[] {"B","C","D","E","F","G","H","L"};
//创建一个字符数组来保存路径
String[] path = new String[count];
path[0] = "A";
String[] p = function(s, v, arr, dist, 0, dit, path);
for(int i = 1; i < p.length ; i++) {
System.out.println(p[i]);
}
}
// 迭代操作,i代表操控哪一行
public static String[] function(List<Integer> s, int[] v, int[][] arr, int[] dist, int i,String[] dit, String[] path) {
// 定义两个变量来记录最小值,和所在的列
int min = 200;
int row = 0;
// 取出第i行领结矩阵的值并进行相关操作
for (int k = 0; k < v.length; k++) {
if (v[k] != 0) {
int j = v[k];
//判断交换的
if (arr[i][j] <= min && arr[i][j] != 0) {
min = arr[i][j];
row = j;
}
int add = dist[i] + arr[i][j];
//更新最短路径值
if (arr[i][j] != 0 && (add < dist[j] || dist[j] == -1)) {
dist[j] = add;
//创建路径也会自动更新,奇迹
path[j] = path[i]+"-->"+dit[j-1];
}
}
}
// 更新两个集合
s.add(v[row - 1]);
v[row - 1] = 0;
//递归操作
if (s.size() != v.length + 1) {
function(s, v, arr, dist, row, dit , path);
}
//结果路径
return paths(path,dist);
}
//对结果进行处理
public static String[] paths(String[] path, int [] dist) {
String[] strPath = new String[path.length];
for(int i = 0; i< path.length; i++) {
strPath[i] = ""+path[i]+" "+dist[i];
}
return strPath;
}
// 创建数组
public static int[][] makeArr(int count) {
Scanner sc = new Scanner(System.in);
//创建一个数组
int[][] arr = new int[count][count];
System.out.println("请输入图的边数");
int bians = sc.nextInt();
System.out.println("输入边和边长");
for(int i = 0; i < bians; i++) {
int x = sc.nextInt()-1;
int y = sc.nextInt()-1;
int val = sc.nextInt();
arr[x][y] = val;
arr[y][x] = val;
}
return arr;
}
实际效果展示
这就是起始点到其它点的最短路径