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


    分析的大佬的代码~

    问题

    很久以前,某王国拥有 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 }
  • 相关阅读:
    java基础面试题-1
    深入探讨 Java 类加载器
    毕向东—Java基础知识总结(超级经典)
    nyoj-161-取石子 (四)
    nyist-751-破坏城市
    nyist-144-小珂的苦恼
    zoj-1047-I Think I Need a Houseboat
    zoj-1045-HangOver
    zoj-1037-Gridland
    hdoj-2268-How To Use The Car
  • 原文地址:https://www.cnblogs.com/dream-flying/p/12800444.html
Copyright © 2020-2023  润新知