求一个点到另一个点的最短路径的思路及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]);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法是一种解图中最短路径的经典算法,可以用Java语言来实现。具体实现方法如下: 1. 定义一个长度为n的布尔型数组visited,表示每个节是否已被访问过,初始化所有值为false; 2. 定义一个长度为n的整型数组distance,表示起到每个节的距离,初始化起的值为0,其余节的值为无限大(设为Integer.MAX_VALUE); 3. 定义一个长度为n的整形数组predecessor,表示每个节的前驱节,初始化所有值为null; 4. 从起开始,将distance值最小的节标记为已访问过,然后更新与该节相邻的节的distance值和predecessor值; 5. 重复上述步骤,直到所有节都被标记为已访问或者没有与起相连的节可访问; 6. 最后得到起到终最短路径代码示例: ``` public class Dijkstra { public static void dijkstra(int[][] graph, int start) { int n = graph.length; boolean[] visited = new boolean[n]; int[] distance = new int[n]; Integer[] predecessor = new Integer[n]; Arrays.fill(visited, false); Arrays.fill(distance, Integer.MAX_VALUE); distance[start] = 0; for (int i = 0; i < n - 1; i++) { int minDistance = Integer.MAX_VALUE; int minNode = -1; for (int j = 0; j < n; j++) { if (!visited[j] && distance[j] < minDistance) { minDistance = distance[j]; minNode = j; } } if (minNode == -1) { break; } visited[minNode] = true; for (int j = 0; j < n; j++) { if (graph[minNode][j] > 0 && distance[minNode] + graph[minNode][j] < distance[j]) { distance[j] = distance[minNode] + graph[minNode][j]; predecessor[j] = minNode; } } } // print result for (int i = 0; i < n; i++) { if (i == start) { continue; } if (distance[i] == Integer.MAX_VALUE) { System.out.println(String.format("No path from %d to %d", start, i)); } else { List<Integer> path = new ArrayList<>(); int node = i; while (node != start) { path.add(node); node = predecessor[node]; } path.add(start); Collections.reverse(path); System.out.println(String.format("Shortest path from %d to %d: %s (distance=%d)", start, i, path, distance[i])); } } } public static void main(String[] args) { int[][] graph = {{0, 1, 4, 0, 0}, {1, 0, 2, 5, 0}, {4, 2, 0, 1, 3}, {0, 5, 1, 0, 2}, {0, 0, 3, 2, 0}}; dijkstra(graph, 0); } } ``` 此代码演示了如何用Java语言实现Dijkstra算法出从节0到其余节最短路径算法基本思路是:先初始化distance数组,然后从distance值最小的未访问节开始遍历,更新与该节相邻的节的distance值和predecessor值,直到所有节都被访问或者没有可访问的节为止。最后,可以根据predecessor数组得到从起到终最短路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值