import java.util.Arrays;
import java.util.Scanner;
/*
迷宫的最短路径:
求 一个点 到 另一个点 的最短路径
输入描述
第一行输入两个个正整数 N和 P,其中N表示路标的数量, P表示通道的数量。 (1 < N <= 200, 0 <= P <= N * (N - 1) / 2 )
接下来的P行,每行输入三个正整数 A, B, T,A表示起点路标的编号,
B表示终点路标的编号,T表示路标A到路标B需要时间T。 (0 <= A, B <= N-1, 1 <= T <= 100)
最后一行输入一个正整数 X,表示裁判给出的终点路标编号 (0 =< X <= N)
输出描述
输出一个正整数,表示小车从0号路标到X号路标之间移动的最短用时
样例输入
4 5
0 1 15
1 2 15
0 3 50
1 3 30
2 3 10
3
样例输出
40
*/
public class MinRoad {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//第一行输入两个个正整数 N和 P,其中N表示路标的数量, P表示通道的数量
int n = in.nextInt();
int p = in.nextInt();
//时间矩阵
int [][] cost = new int[n][n];
//初始化时间花费矩阵
for (int [] link : cost) {
Arrays.fill(link, 101);// 1 =< t <= 100
}
//接下来的P行,每行输入三个正整数 A, B, T,A表示起点路标的编号,
//B表示终点路标的编号,T表示路标A到路标B需要时间T。
for (int i = 0; i < p; i ++) {
int a, b, t;
a = in.nextInt();//起点
b = in.nextInt();//终点
t = in.nextInt();//起点到终点需要的时间
//无向
cost[a][b] = t;
cost[b][a] = t;
}
//最后一行输入一个正整数 X,表示裁判给出的终点路标编号 (0 =< X <= N)
int target = in.nextInt();
in.close();
//思路:判断 从i到j的距离,和从i到k,再从k到j的距离的大小,选择怎么走
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
//从i到k,再从k到j的距离的大小
for (int k = 0; k < n; k ++) {
if (cost[i][j] > (cost[i][k] + cost[k][j])) {
//更新需要话费较小时间的
cost[i][j] = cost[i][k] + cost[k][j];
}
}
}
}
//从0出发到target的最小路径
System.out.println(cost[0][target]);
}
}
求一个点到另一个点的最短路径的思路及JAVA代码
最新推荐文章于 2022-09-01 17:31:37 发布