设为首页 收藏本站
查看: 1165|回复: 0

[经验分享] 2017华为机试题--Floyd算法

[复制链接]

尚未签到

发表于 2017-7-10 18:04:15 | 显示全部楼层 |阅读模式
  小K是X区域的销售经理,他平常常驻“5”城市,并且经常要到“1”、“2”、“3”、“4”、“6”城市出差。当机场出现大雾情况时,会导致对应城市的所有航班的起飞及降落均停止(即不能从该城市出发,其他城市也不能到达该城市)。小K希望知道如果他需要到X城市出差时,如果遇到Y城市出现大雾,他最短的飞行时间及飞行路径。
  注意:当两个城市间不可达时,消耗时间默认取1000.
  各城市简的飞行时间如下表所示,加粗行代表始发城市,加粗列代表终点城市,矩阵中的值代表从始发城市飞到终点城市所耗时间(单位:小时),M代表不可达(注意飞行线程是单向的,即A->B不等于B->A),例如
  (1)从1号城市飞行到4号城市花费5h,从4号城市飞到1号城市花费2h
  (2)从5号城市飞行到3号城市不可达,从3号城市飞到5号城市花费7h
  1    2    3    4    5    6
  1  0h  2h  10h  5h  3h   M
  2  M   0h  12h   M   M   10h
  3  M   M    0h    M   7h  M
  4  2h  M    M     0h  2h  M
  5  4h  M    M     1h  0h  M
  6  3h  M    1h    M   2h  0h
  输入描述:
  输入出差城市X(X可为1、2、3、4、6)
  输入大雾城市(Y可为0、1、2、3、4、5、6,可为0时代表没有城市出现大雾)
  代码如下:



import java.util.*;

public class Main2 {
     private static int INF = 1000;

     private static Integer[][] dist;
     private static Integer[][] path;

     private static List<Integer> result = new ArrayList<Integer>();
//调试
     public static void printMatrix(Integer[][] matrix) {
         for (int i = 0; i < matrix.length; i++) {
             for (int j = 0; j < matrix.length; j++)
                 System.out.print(matrix[j] + " ");
             System.out.println();
         }
     }
//设置雾城市
     private static void setFog(int[][] matrix, int city) {
         for (int i = 0; i < matrix.length; i++) {
             matrix[city] = matrix[city] = INF;
         }
     }

     public static void main(String[] args) {

         int size = 6;

         int begin = 4;
         Scanner scan = new Scanner(System.in);
         int end = Integer.parseInt(scan.nextLine()) - 1;
         int foggy = Integer.parseInt(scan.nextLine()) - 1;
         scan.close();

         int[][] matrix = { { 0, 2, 10, 5, 3, INF },
                 { INF, 0, 12, INF, INF, 10 }, { INF, INF, 0, INF, 7, INF },
                 { 2, INF, INF, 0, 2, INF }, { 4, INF, INF, 1, 0, INF },
                 { 3, INF, 1, INF, 2, 0 } };
         init(size);
         //没有雾
         if (foggy != -1)
             setFog(matrix, foggy);
//调用弗洛伊德
         floyd(matrix);

         findPath(begin, end);
         System.out.println(dist[begin][end]);
         for (int i = 0; i < result.size(); i++)
             result.set(i, result.get(i) + 1);
         if (dist[begin][end] == INF)
             result.removeAll(result);
         System.out.println(result);
     }
//在path数组里找路径
     public static void findPath(int i, int j) {
         int ci = i, ccj = j;
         while (path[j] != -1) {
             int cj = path[j];
             result.add(cj);
             i = cj;
         }
         result.add(0, ci);
         result.add(ccj);
     }

     public static void floyd(int[][] matrix) {
         int size = matrix.length;
         for (int i = 0; i < size; i++)
             for (int j = 0; j < size; j++) {
                 path[j] = -1;
                 dist[j] = matrix[j];
             }
         for (int k = 0; k < size; k++) {
             for (int i = 0; i < size; i++) {
                 for (int j = 0; j < size; j++) {
                     if (dist[k] != INF && dist[k][j] != INF
                             && dist[k] + dist[k][j] < dist[j]) {
                         dist[j] = dist[k] + dist[k][j];
                         path[j] = k;
                     }
                 }
             }
         }
     }
//初始化两个数组
     public static void init(int size) {
         path = new Integer[size][size];
         dist = new Integer[size][size];
     }
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392474-1-1.html 上篇帖子: 2017 校招华为上机题 下篇帖子: [华为]计算字符个数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表