小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[i][j] + " ");
System.out.println();
}
}
//设置雾城市
private static void setFog(int[][] matrix, int city) {
for (int i = 0; i < matrix.length; i++) {
matrix[i][city] = matrix[city][i] = 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[i][j] != -1) {
int cj = path[i][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[i][j] = -1;
dist[i][j] = matrix[i][j];
}
for (int k = 0; k < size; k++) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (dist[i][k] != INF && dist[k][j] != INF
&& dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = k;
}
}
}
}
}
//初始化两个数组
public static void init(int size) {
path = new Integer[size][size];
dist = new Integer[size][size];
}
}

2017华为机试题--Floyd算法的更多相关文章

  1. 牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  2. 华为机试题【13】-wave数组找字母游戏

    题目描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你 ...

  3. 华为机试题【10】-求数字基root

    题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一 ...

  4. 华为机试题——数组排序,且奇数存在奇数位置,偶数存在偶数位置

    题目要求很简单,就是给你一个数组,对它进行排序,并且排序后,奇数要放在奇数的位置上,偶数要放在偶数的位置上,如果不满足这个规则的话就在数组上填充0 实现代码如下,文中值得注意的一点就是如何判读这个数字 ...

  5. 求一个int型整数的两种递减数之和(java)--2015华为机试题

    题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的 ...

  6. 华为机试题 N阶楼梯的走法,每次走一步或者两步

    在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 ...

  7. 华为机试题:仿LISP

    package com.nowcoder.huawei; import java.util.*; public class LISP { // 只通过80% // (+ (* 2 3) (^ 4)) ...

  8. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  9. 2014华为机试西安地区A组试题

    2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...

随机推荐

  1. JavaScript中数组Array方法详解

    ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...

  2. Android 视频编辑 SDK

    Android 视频编辑 SDK接入说明 一.名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1 ...

  3. Python入门教程(2)

    人生苦短,我玩蛇0.0! Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991 ...

  4. jQ试题的总结

    jQuery习题的一些总结   1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has $ ...

  5. Ubuntu14.04: Error found when loading /root/.profile

    问题描述: 启用root账号登录后系统出现如下提示信息: Error found when loading /root/.profile stdin:is not a tty 解决方法: 在终端中用命 ...

  6. hadoop使用笔记

    一:hadoop程序添加三方包: 使用hadoop jar 运行时 抛出 java.lang.NoClassDefFoundError 原因:找不到三方包 解决方案: 1.可以将需要使用的包添加进 $ ...

  7. 简单总结在51cto平台的两日学习

    许久未曾静下心写东西,希望这会是一个好习惯的开始. 一次偶然的机会,大概是160415在Applestore邂逅51cto,看了点评果断下载,着实是一款优秀的学习软件. 由于最近正在用python写自 ...

  8. Android学习总结(十五) ———— Notification(状态栏通知)基本用法

    一.Notification基本概念  Notification是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容.我们在用手机的时候 ...

  9. Binary Search Tree Iterator leetcode

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  10. 前端资讯周报 3.6 - 3.12: 对学习Javascript最有帮助的三本书,以及HTML标题的迷思

    每周一我都会分享上一周我订阅的技术站点中,和解决问题的过程中阅读到的值得分享的文章. 毕竟个人的阅读量有限,也欢迎大家留言或者私信给我你们阅读到的,对你们前端技术有帮助的任何内容,题材不限,语言不限. ...