2019阿里校招测评题 光明小学完全图最短路径问题
题目:
光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么?
光明小学可以抽象成一张有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阿里校招测评题 光明小学完全图最短路径问题相关推荐
- 2019阿里校招测评题 物流派送员最短路径问题
题目: 解题思路: 还是尝试用全排列先去求个解出来,把所有可能的路径都求出来,找出最短的那个. 但是感觉用启发式算法效果会更好,尝试使用两元素优化求解. 代码实现: 全排列版本: public cla ...
- 2019阿里校招测评题,光明小学完全图最短路径问题
光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? 光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连.光明小 ...
- 2019阿里校招测评题(编程)
明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? 光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连.光明小学 ...
- python笔试题奥特曼打怪兽_2019阿里校招测评题,光明小学完全图最短路径问题(python实现)...
题目:光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么? 光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连. ...
- 2019阿里校招测评——光明小学接力赛(Java)
合理宣泄下:太久没做题了,脑子锈了~然后拿到题,莫名大脑空白了10分钟,再接着看懂了题目,但就是不晓得怎么下手.所以就计划边写边想(至少把输入,主函数什么的敲进去),但是!!!不晓得是按错了Tab键还 ...
- 2019阿里校招面试【前端】(一)
2019阿里校招面试一面(前端) 问题: 项目里面遇到的困难 promise请求失败如何返回原来页面 call/apply/bind 数组中找某个元素的方法和时间复杂度 前端工程化 继承的方式 跨域 ...
- 大疆校招测评题--循环赛问题
笔者在2022.7参加了大疆的测评题. 其中有道循环赛问题,记录下解题思路. 循环赛问题 六名选手A, B, C, D, E, F进行循环赛. 每两名选手间比赛一次,每名选手每天比赛一场. 五天内完成 ...
- 2019 快手校招编程题两道解答
[编程题] 二进制中有多少个1 时间限制:1秒 空间限制:32768K 把一个32-bit整型转成二进制,其中包含多少个1,比如5的二进制表达是101,其中包含2个1 输入描述: 输入为整型(十进制) ...
- 滴滴2016校招测评题(建水库问题)
一.前言 每周面试题,这周来个简单点,而且最近也在写 Android 自定义 View 系列的文章,欢迎大家关注公众号[于你供读],每周推送面试题,每天推送技术干货. 二.题目 已知每个城市的用水需求 ...
最新文章
- java中上转型概念_在java 中,什么叫向上转型?
- Java虚拟机详解(五)------JVM参数(持续更新)
- Node中的Http模块和Url模块的使用
- 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
- React工作(1)---export导出
- JavaScript面向对象的理解
- android html 换行_Android-富文本处理-html字符串去掉内部样式,统一添加body、style,统一支持换行等...
- 用js实现分页功能以及利用xml实现分页功能——数据岛
- Linux下PhpMyAdmin程序目录的安全管理
- Machine Learning - VI. Logistic Regression逻辑回归 (Week 3)
- Dbutils常见方法
- vi vim 查找和替换字符串 命令
- 虚幻引擎UE4加载GIS数据《数字孪生智慧城市》
- 计算机网络路由交换技术运用,计算机网络路由交换的技术应用与发展趋势研究...
- ps钢笔抠图的的引用说明
- sketch里的ios控件_「插件」五分钟了解微信团队打造的 Sketch 插件 :WeSketch
- 区块链现在的样子:当年的DOS操作系统
- 35,UC(14) .
- Mysql培训第二天
- error C2248: “CObject::CObject”: 无法访问private 成员(在“CObject”类中声明)