求一个点到另一个点的最短路径的思路及JAVA代码

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]);
    }
}


版权声明:本文为qq_43515131原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。