分析的大佬的代码~
问题:
很久以前,某王国拥有 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 }