题目:光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么?

光明小学可以抽象成一张有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。要求时间复杂度控制在O(N^3*log(M))。

map数组表示了一张稠密图,其中任意两个不同节点i,j间都有一条边,边的长度为map[i][j]。N表示其中的节点数。

你要返回的数组也必然是一个N * N的二维数组,表示从i出发走到j,经过M条边的最短路径

你的路径中应考虑包含重复边的情况。

一 、求解

先来说一下求解这一题的思路,这个问题的本质就是M步无向图的最短路径遍历,一般求解最短路径问题,我们首先想到的就是采用递归实现。

已知有N个节点,求解从节点i到节点j之间的M步的最短路径问题,我们可以把M步分解成1步和M-1步:

1、假设存在节点k,且k节点不同于节点i,节点j,第一步求解节点i到节点k之间的1步最短路径

2、剩下M-1步,可以看做求解节点k到节点j之间的M-1步最短路径问题

3、当k取不同值时,我们会得到多个距离值,选取最小的一个距离值

#-*- coding: utf-8 -*-

"""Created on Fri Aug 3 08:54:35 2018

@author: zy"""

importnumpy as npdefSolve(maps,M):'''由N个节点两两连接组成路径,选取从节点i->节点j之间的最短M条路径

param:

maps:二维数组,由两两节点之间的路径长度组成

M:表示所经过的路径个数'''

'''输入校验'''

if notisinstance(maps,(list,np.ndarray)):raise ValueError('输入参数maps数据类型必须是list或者numpy.array')if len(maps.shape) != 2:raise ValueError('输入参数maps为二维数组')if maps.shape[0] != maps.shape[1]:raise ValueError('输入二维数组maps行数和列数要求一致')#计算节点的个数

N =maps.shape[0]if N<2 or N>100:raise ValueError('输入二维数组maps行数必须在2~100之间')if M<2 or M>1E6:raise ValueError('输入参数N的值必须在2~1e6之间')#输入二维数组数值校验

for i inrange(N):for j inrange(i,N):if maps[i][j] !=maps[j][i]:raise ValueError('输入二维数组maps必须是对称的')if maps[i][j] < -1e8 or maps[i][j] > 1e8:raise ValueError('二维数组maps的元素值必须在-1e8~1e8之间')if i==j:if maps[i][j] !=0:raise ValueError('二维数组maps的对角元素值必须是0')#用于保存i->j的路径值

res =np.zeros_like(maps)#计算节点i->j的最短路径

for i inrange(N):for j inrange(i,N):

res[i][j]=MinPath(maps,M,i,j)

res[j][i]=res[i][j]returnresdefMinPath(maps,M,i,j):'''计算i->j的最短路径'''

#递归终止条件

if M == 1:returnmaps[i][j]'''计算i->j的最短路径'''N=maps.shape[0]#用于保存i->j的可能路径长度

length =np.zeros(N)#遍历从k->j的最短路径

for k inrange(N):if k != i and k !=j:#k->j的M-1条最短路径 + i->k的一条路径

length[k] = MinPath(maps,M-1,k,j) +maps[i][k]#进行排序,过滤掉为0的值

length =np.sort(length)for i inlength:if i !=0:returniif __name__ == '__main__':#maps = np.array([[0,2,3],[2,0,1],[3,1,0]])

maps = np.array([[0,2,3,4],

[2,0,1,3],

[3,1,0,2],

[4,3,2,0]

])

M= 3result=Solve(maps,M)print(result)

二、时间复杂度分析

我们来分析一下该算法的时间复杂度。

先来分析一下递归函数MinPath(maps,M,i,j):

1、函数的规模为M

2、当规模是1时,函数结束

3、假设T(M)表示规模为M的问题所需要的步骤数

算法的递归方程为:T(M) = (N-2)T(M - 1) +3N+6

注释:3N+6表示规模毎减少一次,所做的步骤数

if M==1: 1次

N=maps.shape[0] 1次

length = np.zeros(N) 1次

for k in range(N): N次

if k != i and k != j: N次

+maps[i][k] 当i==j时 N-1次,否则N-2次 我们取N-2次

length =np.sort(length) 1次

最后的for循环 2次或者4次 我们取4次

迭代展开:T(M) = (N-2)T(M - 1) + 3N+6

=(N-2)[(N-2)T(M-2) + 3N + 6] + 3N+6

=(N-2)2T(M-2) + (N-2)(3N+6) + 3N+6

=(N-2)3T(M-3) + (N-2)2(3N+6) + (N-2)(3N+6) + 3N+6

=....

=(N-2)(M-1) + (N-2)(M-2)(3N+6)+...+3N+6

=(N-2)(M-1) + [(N-2)(M-1)(3N+6) - 3N-6]/(N-3)

= O((N-2)(M-1))

Solve函数中递归函数循环的次数为N(1+N)/2,所以算法的复杂度为O(N2(N-2)(M-1))。并没有满足题目的要求,更好的求解方法我还没有想到,有了解的大佬可以告诉小弟。

参考文章:

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

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

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

  2. python笔试题奥特曼打怪兽_python文字小游戏——奥特曼大战小怪兽

    历时三天,辛辛苦苦,废寝忘食,呕心沥血之作!!! 这是一个我根据自己的想法做出来的一个模拟以前文字游戏的小游戏 里面的主要实现是:玩家通过控制台输入键盘指令来进行操作,存取档,输游戏名,地图移动并随机 ...

  3. python笔试题奥特曼打怪兽_一个python面试笔试题

    init 和 new 的作用和返回值?详细描述一下类的创建过程?如何捕获类的属性定义顺序? __new__在创建实例对象的时候调用,返回实例对象的内存地址,传递给__init__方法,就是self的值 ...

  4. python笔试题奥特曼打怪兽_python笔试做错的题目

    a = [1,2,3] b = a print(id(a),id(b),a == b) print(a,b) b = b + [1,2,3] print(a,b) print(id(a),id(b), ...

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

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

  6. 用Python做一个奥特曼打怪兽的小游戏

    话不多说,往下看吧! 引入需要的模块 from sprites import * from pygame import mixer 设置页面格式(宽高等等) width,height = 800,60 ...

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

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

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

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

  9. Python奥特曼打怪兽射击游戏(基于海龟画图创作的作品,来自Python创意编程100例sprites篇_Python精灵模块)

    相信这竟然是Python用海龟画图制作的作品吗? sprites模块就是用python的turtle模块开发的!所以本作品仍属于Python海龟画图作品 """奥特曼打怪 ...

最新文章

  1. 自然语言处理最新论文速递
  2. 吴恩达机器学习笔记 —— 16 异常点检测
  3. 快速指南:在DevOps中实现持续交付
  4. 泛函编程(19)-泛函库设计-Parallelism In Action
  5. oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
  6. TCP/IP协议:链路层
  7. VTK:相互作用之EllipticalButton
  8. 自适应宽度元素单行文本省略用法探究
  9. ThreadLocal系列(二)-InheritableThreadLocal的使用及原理解析
  10. vc浏览器_自主创业项目推荐,晨兴资本刘芹:我的市场非共识+超配投资原则VC洞见...
  11. Spring Boot 如何使用拦截器、过滤器、监听器?
  12. 分布式存储系统学习笔记(三)—分布式键值系统(1)—Amazon Dynamo
  13. 清华大学计算机考研资料汇总
  14. eclipse插件下载最新地址
  15. android离线身份证识别(从相册选择)
  16. python 中 websocket实现消息定时推送
  17. java的8年来工作汇总
  18. Java通过JNI调用C的一个小demo
  19. ppp协议 服务器,PPP(点对点协议(Point to Point Protocol))_百度百科
  20. 如何把PPT连背景一起复制?

热门文章

  1. 2022年多益网络秋招笔试
  2. 修改注册表设置ie主页
  3. 【原】解决php 下 ie 无法下载 来自 无法打开该internet 站点 的问题
  4. 共享电单车充电桩平台
  5. 单片机初学者编程经常会碰到的问题及处理办法
  6. python构造函数调用成员函数_Python 子类构造函数调用
  7. 目标检测——detr源码复现【 End-to-End Object Detection with Transformers】
  8. X-Security X的安全控制
  9. 黄明:行为金融学和量化投资的应用
  10. ca证书 csr_ca证书csr crt cer