Loading

第十四题、最短路径(难度系数100)

最短路径
描述:
已知一个城市的交通路线,经常要求从某一点出发到各地方的最短路径。例如有如下交通图:
在这里插入图片描述
则从A出发到各点的最短路径分别为:
B:0
C:10
D:50
E:30
F:60
输入:
输入只有一个用例,第一行包括若干个字符,分别表示各顶点的名称,接下来是一个非负的整数方阵,方阵维数等于顶点数,其中0表示没有路,正整数表示两点之间边的长度。可以假定该图为有向图。
最后一行为要求的出发点。
输出:
输出从已知起点到各顶点的最短路径长度。输出格式是根据顶点输入顺序,依次输出其最智短路径长度。各顶点分别用一行输出,先输出目标顶点,然后一冒号加一个空格,最后是路径长度。0表示没有路。
样例输入:

ABCDEF
0 0 10 0 30 100
0 0 5 0 0 0
0 0 0 50 0 0
0 0 0 0 0 10
0 0 0 20 0 60
0 0 0 0 0 0
A

样例输出:

B: 0
C: 10
D: 50
E: 30
F: 60

参考:


import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        int len = name.length();
        int[][] mp = new int[len][len];
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                mp[i][j] = sc.nextInt();
            }
        }
        int st = name.indexOf(sc.next());
        boolean[] vis = new boolean[len];
        int[] dis = new int[len];
        Arrays.fill(dis, Integer.MAX_VALUE);
        dis[st] = 0;
        for (int i = 0; i < len - 1; i++) {
            int id = -1, mx = Integer.MAX_VALUE;
            for (int j = 0; j < len; j++) {
                if (!vis[j] && dis[j] < mx) {
                    id = j;
                    mx = dis[j];
                }
            }
            if (id == -1) break;
            vis[id] = true;
            for (int j = 0; j < len; j++) {
                if (!vis[j] && mp[id][j] != 0 && dis[id] + mp[id][j] < dis[j]) {
                    dis[j] = dis[id] + mp[id][j];
                }
            }
        }
        for (int i = 0; i < len; i++) {
            if (i == st) continue;
            if (dis[i] == Integer.MAX_VALUE) dis[i] = 0;
            System.out.println(name.charAt(i) + ": " + dis[i]);
        }
    }
}
posted @ 2023-02-19 19:27  qing影  阅读(20)  评论(0)    收藏  举报  来源