题目:

光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么?
光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连。光明小学的每个班都有M个学生,所以你要为他们设计出一条恰好经过M条边的路径。
光明小学的小朋友们希望全盘考虑所有的因素,所以你需要把任意两点间经过M条边的最短路径的距离输出出来以供参考。

你需要设计这样一个函数:
res[][] Solve( N, M, map[][]);
注意:map必然是N * N的二维数组,且map[i][j] == map[j][i],map[i][i] == 0,-1e8 <= map[i][j] <= 1e8。(道路全部是无向边,无自环)2 <= N <= 100, 2 <= M <= 1e6。

map数组表示了一张稠密图,其中任意两个不同节点i,j间都有一条边,边的长度为map[i][j]。N表示其中的节点数。
你要返回的数组也必然是一个N * N的二维数组,表示从i出发走到j,经过M条边的最短路径
你的路径中应考虑包含重复边的情况。

样例:

N = 3
M = 2
map = {
 {0, 2, 3},
 {2, 0, 1},
 {3, 1, 0}
}

输出结果result为:
result = {
 {4, 4, 3},
 {4, 2, 5},
 {3, 5, 2}
}

输入样例:

3
2
3 3 
0 2 3
2 0 1
3 1 0

输出样例:

[[4, 4, 3],

[4, 2, 5],

[3, 5, 2]]

解题思路:

首先第一点是肯定的,全排列肯定是可以求出解的,但是时间复杂度那肯定是爆炸的,当然,30分钟的时间里面能把全排列写出来也是可以的了我感觉。

但是还是想试试动态规划能不能求解,我们把每一步的中间结果都存下来,相当于对搜索进行了剪枝操作。当然,动态规划是基于以下的假设:

如果从点s到点t存在最小路径而且正好经过点c,那从s到c的所有路径当中,这条s->c一定是最短路径。

很好理解,如果当前这条s->c(我们称之为l1)不是最短的话,那肯定存在一条s->c路径(l2)最短,那走2到t肯定比走l1到t短,所以l1肯定就被替换掉了。

代码实现:

全排列版:

public class Test {private static int[][] resultMap;private static int times = 0;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 初始化int N = scanner.nextInt();int M = scanner.nextInt();int[][] map = new int[N][N];for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++) {map[i][j] = scanner.nextInt();}}resultMap = new int[N][N];// 执行for (int i = 0; i < N; i ++) {route(map, N, M, 1, i, i, 0);}// 打印System.out.println("total recursion: " + times);for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++) {System.out.print(resultMap[i][j] + " ");}System.out.println("");}}private static void route(int[][] map, int N, int M, int step, int head, int now, int cost) {times ++;if (step > M) {resultMap[head][now] = resultMap[head][now] == 0 ? cost : (Math.min(resultMap[head][now], cost));return;}for (int i = 0; i < N; i ++) {if (i == now) continue;route(map, N, M, step + 1, head, i, cost + map[now][i]);}}
}

动态规划版:

public class Test {private static int[][][] resultMap;private static int times = 0;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 初始化int N = scanner.nextInt();int M = scanner.nextInt();int[][] map = new int[N][N];for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++) {map[i][j] = scanner.nextInt();}}resultMap = new int[M][N][N];// 执行,动态规划// 初始化步数为1的情况for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++) {resultMap[0][i][j] = map[i][j];}}// 更新步数2-M的情况for (int k = 1; k < M; k ++) {for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++) {for (int p = 0; p < N; p ++) {times ++;if (p == j || resultMap[k - 1][i][p] == 0) continue;resultMap[k][i][j] = Math.min(resultMap[k][i][j] == 0 ? Integer.MAX_VALUE : resultMap[k][i][j], resultMap[k - 1][i][p] + map[p][j]);}}}}// 打印System.out.println("total recursion: " + times);for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++) {System.out.print(resultMap[resultMap.length - 1][i][j] + " ");}System.out.println("");}}
}

测试结果

3
2
0 2 3
2 0 1
3 1 0
total recursion: 21
4 4 3
4 2 5
3 5 2 

2019阿里校招测评题 光明小学完全图最短路径问题相关推荐

  1. 2019阿里校招测评题 物流派送员最短路径问题

    题目: 解题思路: 还是尝试用全排列先去求个解出来,把所有可能的路径都求出来,找出最短的那个. 但是感觉用启发式算法效果会更好,尝试使用两元素优化求解. 代码实现: 全排列版本: public cla ...

  2. 2019阿里校招测评题,光明小学完全图最短路径问题

    光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? 光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连.光明小 ...

  3. 2019阿里校招测评题(编程)

    明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? 光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连.光明小学 ...

  4. python笔试题奥特曼打怪兽_2019阿里校招测评题,光明小学完全图最短路径问题(python实现)...

    题目:光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? 光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连. ...

  5. 2019阿里校招测评——光明小学接力赛(Java)

    合理宣泄下:太久没做题了,脑子锈了~然后拿到题,莫名大脑空白了10分钟,再接着看懂了题目,但就是不晓得怎么下手.所以就计划边写边想(至少把输入,主函数什么的敲进去),但是!!!不晓得是按错了Tab键还 ...

  6. 2019阿里校招面试【前端】(一)

    2019阿里校招面试一面(前端) 问题: 项目里面遇到的困难 promise请求失败如何返回原来页面 call/apply/bind 数组中找某个元素的方法和时间复杂度 前端工程化 继承的方式 跨域 ...

  7. 大疆校招测评题--循环赛问题

    笔者在2022.7参加了大疆的测评题. 其中有道循环赛问题,记录下解题思路. 循环赛问题 六名选手A, B, C, D, E, F进行循环赛. 每两名选手间比赛一次,每名选手每天比赛一场. 五天内完成 ...

  8. 2019 快手校招编程题两道解答

    [编程题] 二进制中有多少个1 时间限制:1秒 空间限制:32768K 把一个32-bit整型转成二进制,其中包含多少个1,比如5的二进制表达是101,其中包含2个1 输入描述: 输入为整型(十进制) ...

  9. 滴滴2016校招测评题(建水库问题)

    一.前言 每周面试题,这周来个简单点,而且最近也在写 Android 自定义 View 系列的文章,欢迎大家关注公众号[于你供读],每周推送面试题,每天推送技术干货. 二.题目 已知每个城市的用水需求 ...

最新文章

  1. java中上转型概念_在java 中,什么叫向上转型?
  2. Java虚拟机详解(五)------JVM参数(持续更新)
  3. Node中的Http模块和Url模块的使用
  4. 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
  5. React工作(1)---export导出
  6. JavaScript面向对象的理解
  7. android html 换行_Android-富文本处理-html字符串去掉内部样式,统一添加body、style,统一支持换行等...
  8. 用js实现分页功能以及利用xml实现分页功能——数据岛
  9. Linux下PhpMyAdmin程序目录的安全管理
  10. Machine Learning - VI. Logistic Regression逻辑回归 (Week 3)
  11. Dbutils常见方法
  12. vi vim 查找和替换字符串 命令
  13. 虚幻引擎UE4加载GIS数据《数字孪生智慧城市》
  14. 计算机网络路由交换技术运用,计算机网络路由交换的技术应用与发展趋势研究...
  15. ps钢笔抠图的的引用说明
  16. sketch里的ios控件_「插件」五分钟了解微信团队打造的 Sketch 插件 :WeSketch
  17. 区块链现在的样子:当年的DOS操作系统
  18. 35,UC(14) .
  19. Mysql培训第二天
  20. error C2248: “CObject::CObject”: 无法访问private 成员(在“CObject”类中声明)

热门文章

  1. 一对一直播app源码开发,推流技术的实现
  2. MSE考研百日冲刺-98
  3. keyshot分辨率多少合适_keyshot渲染格式(keyshot渲染好后,可以导入3DMAX吗?)
  4. android物品管理软件,物品寄存管理系统下载
  5. 结构程序设计,过程设计工具——程序流程图及盒图
  6. 协同过滤(英语:Collaborative Filtering)
  7. 最简单的解释-Java父类和子类的初始化顺序
  8. 动态二进制插桩原理与实战
  9. Mapreduce 找博客共同好友案例
  10. 乐优商城(十)用户注册