Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路) 接着的第T+1行有S个数,表示和草儿家相连的城市; 接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
Sample Input
6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
Sample Output
1 package practice;
2
3 import java.util.Arrays;
4 import java.util.Scanner;
5
6 public class Travel {
7 private int N = 1000;// 城市总数
8 private int maxTime = 10000;
9 private int[][] map;
10 private Scanner scanner;
11
12 private int maxNum = 1;// 路线所使用到最大城市数量
13 private int[] C;// 到每个城市所需时间
14
15 private int[] s1;
16 private int[] s2;
17
18 private void dijkstra() {
19 int[] finish = new int[maxNum];
20 C = new int[maxNum];
21 for (int i = 0; i < C.length; i++) {
22 C[i] = maxTime;
23 }
24 C[0] = 0;
25 int v = 0;
26
27 for (int i = 1; i < maxNum; i++) {
28 int min = maxTime;
29 for (int w = 0; w < maxNum; w++) {
30 if (finish[w] == 0) {
31 if (C[w] < min) {
32 min = C[w];
33 v = w;
34 }
35 }
36 }
37
38 finish[v] = 1;// 标记为已完成
39 // 更新最近路线
40 for (int w = 0; w < C.length; w++) {
41 if (finish[w] == 0 && (min + map[v][w]) < C[w]) {
42 C[w] = min + map[v][w];
43 }
44 }
45 }
46
47 }
48
49 private void input() {
50 int T, S, D;
51 System.out.println("输入T S D");
52 scanner = new Scanner(System.in);
53 T = scanner.nextInt();
54 S = scanner.nextInt();
55 D = scanner.nextInt();
56 s1 = new int[S];
57 s2 = new int[D];
58 for (int i = 0; i < T; i++) {
59 System.out.println("输入第条" + i + "路");
60 int a, b, c;
61 a = scanner.nextInt();
62 b = scanner.nextInt();
63 c = scanner.nextInt();
64 map[a][b] = map[b][a] = c;
65
66 if (a > maxNum)
67 maxNum = a;
68 if (b > maxNum)
69 maxNum = b;
70 }
71 maxNum += 1;
72 System.out.println("输入相连城市");
73 for (int i = 0; i < S; i++) {
74 s1[i] = scanner.nextInt();
75 map[0][s1[i]] = 0;
76 }
77 System.out.println("输入想去的城市");
78 for (int i = 0; i < D; i++) {
79 s2[i] = scanner.nextInt();
80 }
81 dijkstra();
82
83 }
84
85 public void init() {
86 map = new int[N][N];
87 for (int i = 0; i < N; i++) {
88 for (int j = 0; j < N; j++) {
89 map[i][j] = maxTime;
90 }
91 }
92 map[0][0] = 0;
93 input();
94 dijkstra();
95
96 int[] times = new int[s2.length];
97 for (int i = 0; i < times.length; i++) {
98 times[i] = C[s2[i]];
99 }
100 Arrays.sort(times);
101
102 System.out.println("最短时间是:"+times[0]);
103
104 }
105
106 /*
107 * 模拟已输入数据 private void data() { maxNum = 11; s1 = new int[2]; s2 = new
108 * int[3]; s1[0] = 1; s1[1] = 2; s2[0] = 8; s2[1] = 9; s2[2] = 10; map[0][1]
109 * = 0; map[0][2] = 0; map[1][3] = map[3][1] = 5; map[1][4] = map[4][1] = 7;
110 * map[2][8] = map[8][2] = 12; map[3][8] = map[8][3] = 4; map[4][9] =
111 * map[9][4] = 12; map[9][10] = map[10][9] = 2;
112 *
113 * }
114 */
115
116 public static void main(String[] args) {
117 Travel travel = new Travel();
118 travel.init();
119 }
120 }
利用迪杰斯特拉算法求解最短路
原文:http://www.cnblogs.com/klsf/p/5514104.html