图问题——任意城市之间的最短距离

分析的大佬的代码~

问题

很久以前,某王国拥有 n 个大城市,为了方便交通,国王下令修建了大量的用于连接首都和其他各大城市高速路。为节省经费,王国采用了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。并且,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。G商队是王国重要的运输商队,他们奔波于各大城市之间,为王国的人们运输商品,实现长途贸易。所以,从一个城市马不停蹄地到另一个城市成了G商队最常做的事情。他们有一个钱袋,用于存放往来城市间的运输费。在运输过程中G商队发现,如果不在某个城市停下来休整,在连续行进过程中,他们所花的运输费与他们已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他们花费的运输费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

G商队想知道:他们从某一个城市出发,如果中间不休息,到达另一个城市,所有可能花费的运输费中最多是多少呢?

 

分析

(1)使用Floyd算法求解出图中任意两点之间的最短距离。

(2)不可达用无穷大表示:java使用0x3f3f3f3f表示无穷大

(3)自己到自己距离为0

 

code:

 1 import java.util.Scanner;
 2 
 3 public class Main40 {
 4     public static void main(String[] args) {
 5         Scanner sc = new Scanner(System.in);
 6         int[][] map = new int[16][16];
 7         int max;
 8         int res;
 9         while (sc.hasNext()) {
10             int n = sc.nextInt();
11             int i, j;
12             int a, b, c;
13             //第一次初始化图(填充默认值)
14             for (i = 1; i <= n; i++) {
15                 for (j = 1; j <= n; j++) {
16                     map[i][j] = 0x3f3f3f3f;
17                     if (i == j)
18                         map[i][j] = 0;
19                 }
20             }
21             
22             //真正的初始化(根据输入值)
23             for (i = 1; i <= n - 1; i++) {
24                 a = sc.nextInt();
25                 b = sc.nextInt();
26                 c = sc.nextInt();
27                 map[a][b] = c;
28                 map[b][a] = c;
29             }
30             
31             //计算两个城市最短距离
32             int k;
33             for (k = 1; k <= n; k++) {
34                 for (i = 1; i <= n; i++) {
35                     for (j = 1; j <= n; j++) {
36                         if (map[i][j] > map[i][k] + map[k][j])
37                             map[i][j] = map[i][k] + map[k][j];
38                     }
39                 }
40             }
41             
42             //遍历计算出最大值,并显示矩阵记录结果
43             max = 0;
44             for (i = 1; i <= n; i++) {
45                 for (j = 1; j <= n; j++) {
46                     System.out.print(map[i][j]+" ");
47                     if ((res = cal(map[i][j])) > max)
48                         max = res;
49                 }
50                 System.out.println();
51             }
52             System.out.println(max);
53         }
54 
55     }
56     //计算花费
57     public static int cal(int n) {
58         if (n == 0)
59             return 0;
60         else
61             return cal(n - 1) + 10 + n;
62     }
63 }

 

posted @ 2020-04-29 10:24  Yrc的楚门的世界  阅读(687)  评论(0编辑  收藏  举报