码迷,mamicode.com
首页 > 编程语言 > 详细

利用迪杰斯特拉算法求解最短路

时间:2016-05-21 10:06:39      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:


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
9
 
  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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!