求A到其它点的最短路径
输入
6 9
0 3 28
0 2 4
1 0 2
1 4 10
2 1 15
2 5 8
4 3 4
5 4 18
5 3 13
import java.util.Scanner;
public class Main26 {
static int INF = Integer.MAX_VALUE;// 无法到达
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入points,edges顶点数和边树
int points = sc.nextInt();
int edges = sc.nextInt();
int[][] len = new int[points][points];
// 初始化边(当前点到当前点为0)
for (int i = 0; i < points; i++) {
for (int j = 0; j < points; j++) {
if (i == j)
len[i][j] = 0;
else
len[i][j] = INF;
}
}
sc.nextLine();
for (int i = 0; i < edges; i++) {
String[] data = sc.nextLine().split(" ");
len[Integer.parseInt(data[0])][Integer.parseInt(data[1])] = Integer.parseInt(data[2]);
}
/**
* 用一个一维数组存储当前点到其它点的距离 因为要根据二维数组获取点到点的距离, 不改变二维数组的值
*/
int[] dis = new int[points];
// 初始化点1到其余各个顶点的初始距离
for (int i = 0; i < points; i++) {
dis[i] = len[0][i];
}
// 定义标记数组,标记距离点1最近的点被选择的数据
boolean[] flag = new boolean[points];
flag[0] = true;// 初始默认选择点1
int min;
int current = 0;
for (int i = 0; i < points; i++) {
min = INF;
// 寻找距离点1最近的点
for (int j = 0; j < points; j++) {
if (!flag[j] && dis[j] < min) {
min = dis[j];
current = j;
}
}
// 设置这个距离点1的点被选择
flag[current] = true;
// 获取这个最短的点到其它点的距离
for (int m = 0; m < points; m++) {
if (len[current][m] < INF) {
if (dis[m] > dis[current] + len[current][m]) {
dis[m] = dis[current] + len[current][m];
}
}
}
}
// 输出最终的结果
for (int i = 0; i < points; i++) {
System.out.print(dis[i] + " ");
}
}
}
输出结果
0 19 4 25 29 12