第十四题、最短路径(难度系数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]);
}
}
}