华为2025年校招笔试手撕真题教程(二)

一、题目

大湾区某城市地铁线路非常密集,乘客很难一眼看出选择哪条线路乘坐比较合适,为了解决这个问题,地铁公司希望你开发一个程序帮助乘客挑选合适的乘坐线路,使得乘坐时间最短,地铁公司可以提供的数据是各相邻站点之间的乘坐时间。

解答要求

时间限制:C/C++1000ms,其他语言:2000ms内存限制:C/C++256MB,其他语言:512MB

二、分析

该问题要求开发一个程序帮助乘客选择乘坐时间最短的地铁线路,地铁公司提供的数据是各相邻站点之间的乘坐时间。这是一个典型的最短路径问题,可以借助图论中的算法来解决。首先,把整个地铁网络抽象为一个有向图,图中的节点代表地铁站点,边代表站点之间的连接(线路段),边上的权重则表示该段的乘坐时间。对于换乘的情况,可以视为通过换乘站这一节点,将不同线路的站点连接起来,即换乘站作为一个特殊节点,其出边可以连接到其他线路的相邻站点,且换乘时间可以当作特殊边的权重(若换乘需要额外时间则需考虑,否则权重为0)。

接下来,需要明确输入数据的格式。通常,可能需要输入站点数量、线路数量,以及每条线路的站点顺序和相邻站点之间的行驶时间。例如,对于一条包含多个站点的线路,依次给出每两个相邻站点之间的时间。此外,还需明确换乘站之间的换乘时间,或者默认换乘时间为0(即在换乘站直接换乘到其他线路无额外时间开销)。针对这一问题,Dijkstra算法是一个合适的选择。因为Dijkstra算法能够高效地找到加权图中两点之间的最短路径,假设地铁乘坐时间都是非负的,这满足Dijkstra算法的适用条件。

具体实现时,首先要构建图结构。使用邻接表或邻接矩阵来表示图。邻接表在稀疏图中更为高效,而邻接矩阵在稠密图中查询速度快。对于地铁网络,通常站点数量较多但每个站点的相邻站点数量有限(尤其是换乘站可能连接多条线路),所以邻接表可能是更好的选择。每个节点的邻接列表中存储了其相邻站点以及对应的乘坐时间(权重)。然后,读取所有线路信息以及相邻站点时间,并构建邻接表。对于每条线路,依次将相邻站点之间的连接加入图中。同时,处理换乘站之间的连接,把换乘视为从一个站点到其他线路的相邻站点的边(如果允许直接换乘到下一站而无需重新进站等),或者更可能的是,换乘站本身作为一个节点,其邻接站点包括同一线路的前后站点以及其他线路在该换乘站的站点。

用户输入起点和终点后,程序以起点作为源节点,运行Dijkstra算法计算到各个站点的最短时间。Dijkstra算法的核心是维护一个距离数组,记录从起点到每个节点的当前最短距离,并使用优先队列(通常是最小堆)来选择下一个要处理的节点。每次从优先队列中取出距离起点最近的节点,更新其邻接节点的距离。重复这一过程直到处理完所有节点或者找到终点为止。算法结束后,距离数组中终点对应的值即为最短乘坐时间。如果终点不可达(距离仍为初始的无穷大值),则输出无法到达。

此外,需要考虑效率问题。因为地铁线路可能非常密集,站点数量庞大,所以算法的时间复杂度和空间复杂度需要控制在合理范围内。Dijkstra算法的时间复杂度在使用优先队列实现时为O(M + N log N),其中M是边数,N是节点数。对于大规模的地铁网络,这应该是可行的,但需要确保数据结构的高效性,例如使用堆优化的Dijkstra算法。

可能的难点在于处理换乘情况。换乘实际上涉及多个线路之间的连接,需要确保图的构建能够正确反映换乘关系。例如,当乘客在换乘站换乘到另一条线路时,该换乘是否算作一个站点到另一个站点的边,还是换乘站作为一个中间节点连接不同线路的站点。一般来说,更合理的模型是将换乘站视为一个节点,其连接同一线路的前后站点以及不同线路在该换乘站的站点。例如,换乘站S属于线路A和线路B,那么在图中,S会有边连接到线路A的前一站和后一站,以及线路B的前一站和后一站,边的权重分别为对应的行驶时间。

另外,输入数据的处理需要仔细设计。例如,每条线路的站点可能以顺序给出,相邻站点之间的时间依次给出。需要将这些信息正确地转换为图中的边。例如,对于线路站点列表[S1, S2, S3, ..., Sn]和时间列表[t1, t2, ..., t(n-1)],则S1到S2的时间是t1,S2到S3的时间是t2,依此类推。同时,如果是双向线路(地铁通常是双向运行的),则需要为每个方向都添加边,即S2到S1的时间也是t1,除非题目说明线路是单向的。

三、代码

由于目前无法确定具体的输入数据格式和细节(如站点如何标识、换乘站的表示方式等),我将基于常见的输入方式提供一个通用的示例代码。以下代码使用Python实现,并基于Dijkstra算法。

import sys
import heapqclass MetroNetwork:def __init__(self):self.adjacency_list = {}def add_station(self, station):if station not in self.adjacency_list:self.adjacency_list[station] = []def add_connection(self, from_station, to_station, time):self.adjacency_list[from_station].append((to_station, time))def dijkstra(self, start, end):# 初始化距离字典distances = {station: float('infinity') for station in self.adjacency_list}distances[start] = 0# 优先队列,存储(距离,节点)priority_queue = [(0, start)]while priority_queue:current_distance, current_station = heapq.heappop(priority_queue)# 如果已经到达终点,可以直接返回if current_station == end:return current_distance# 如果当前距离大于已知的最短距离,则跳过if current_distance > distances[current_station]:continuefor neighbor, time in self.adjacency_list[current_station]:distance = current_distance + timeif distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))# 如果无法到达终点,返回-1或相应提示return distances[end] if distances[end] != float('infinity') else -1def main():# 读取输入input_lines = sys.stdin.read().splitlines()# 第一行是站点和线路信息# 假设第一行是站点数和线路数,接下来是线路的站点和时间信息# 这里需要根据实际输入格式调整# 示例输入格式(仅供参考):# 第一行:2  # 表示两个站点# 第二行:3  # 表示三条线路# 接下来每行是一条线路的站点和时间,如:A B 5 表示A到B需要5分钟# ...# 这里需要根据实际输入格式调整metro = MetroNetwork()# 这里是一个简单的示例,实际需要根据输入格式调整for line in input_lines[1:]:  # 跳过第一行parts = line.strip().split()if len(parts) >= 3:from_station = parts[0]to_station = parts[1]time = int(parts[2])metro.add_station(from_station)metro.add_station(to_station)metro.add_connection(from_station, to_station, time)# 如果是双向的,添加反向连接metro.add_connection(to_station, from_station, time)# 用户输入起点和终点start_station = input("请输入起点站点: ")end_station = input("请输入终点站点: ")# 找到最短路径时间shortest_time = metro.dijkstra(start_station, end_station)if shortest_time != -1:print(f"从{start_station}到{end_station}的最短乘坐时间是: {shortest_time} 分钟")else:print("无法到达目的地")if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP ABAP VK11/VK12 创建销售物料价格(附源码)

需求: 通过接口批量创建销售物料的价格(含阶梯价),对应事务码VK11/VK12 方法:(会在下面源码写出各个方法的优缺点,仅供参考) 通过函数 RV_CONDITION_COPY创建(目前最优)通过函数 BAPI_PRICES_CONDITIONS通过BDC录屏使用VK11事务码进行创建分析: 通过测试可发现,VK…

噪声建模在一小时:最小化准备工作的自监督低光RAW图像去噪

论文标题: Noise Modeling in One Hour: Minimizing Preparation Efforts for Self-supervised Low-Light RAW Image Denoising发表日期: 2025年5月作者: Feiran Li, Haiyang Jiang*, Daisuke Iso发表单位: Sony Research, Tokyo University原文链接: https://arxiv.org/pdf/25…

Puppeteer 浏览器自动化操作工具

pyppeteer 是 Python 版本的 Puppeteer&#xff0c;而 Puppeteer 是由 Google 开发的一个 Node.js 库&#xff0c;用于控制 Chrome 或 Chromium 浏览器。pyppeteer 允许你通过 Python 代码自动化操作浏览器&#xff0c;实现网页爬取、自动化测试、生成截图或 PDF 等功能。 核心…

接口性能测试-工具JMeter的学习

接口登录链接http://111.230.19.204:8080/blog_login.html 一、JMeter基本使用流程 1、启动Jmeter 2、在“测试计划”下添加线程组 3、在“线程组”下添加“HTTP”取样器 4、填写“HTTP请求”的相关请求数据 5、在“线程组”下添加“查看结果树”监听器 6、点击“启动”按钮…

mybatis-plus与jsqlparser共用时报sql解析错误

手动引入jsqlparser-4.6版本&#xff0c;但mybatis-plus中引用为4.4版本 解决方法一&#xff1a; jsqlparser版本与mybatis-plus中引用版本一致。 解决方法而二&#xff1a; 排除掉mybatis-plus中的jsqlparser。

用MMdetection框架训练自己的数据集(全流程实战)

前面我们准备好了COCO格式的数据集&#xff1a;将YOLO格式的数据集转换为mmdetection格式-CSDN博客https://blog.csdn.net/qq_54708219/article/details/148224187?spm1001.2014.3001.5501 下面我们使用MMdetection开始训练。 1.创建新的数据集类 首先&#xff0c;在mmdet/d…

VS Code中Maven未能正确读取`settings.xml`中配置的新路径

在VS Code中Maven未能正确读取settings.xml中配置的新路径&#xff0c;通常是由于以下原因导致的&#xff1a; 一、VS Code未使用你修改的settings.xml文件 VS Code的Maven插件可能使用了默认配置或指向其他settings.xml文件。解决方法&#xff1a; 手动指定settings.xml路径…

2021年认证杯SPSSPRO杯数学建模A题(第二阶段)医学图像的配准全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 A题 医学图像的配准 原题再现&#xff1a; 图像的配准是图像处理领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合同一对象在不同条件下获取的图像。例如为了更好地综合多种信息来辨识不同组织或病变&#xff0c;医生可能使用…

RPM之(1)基础使用

RPM之(1)基础使用 Author: Once Day Date: 2025年5月26日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践记录_Once-Day的博客-CSDN博客 …

国内可做大批量pcb的工厂有哪些?

在电子产业升级浪潮中&#xff0c;PCB作为电子设备的基础载体&#xff0c;其批量生产能力直接决定着终端产品的市场响应速度与品质稳定性。本文精选五家具备核心竞争力的厂商&#xff0c;从工艺深度、产能规模到服务模式展开剖析&#xff0c;为采购决策提供专业参考。 猎板PCB…

【视频】使用海康SDK保存的MP4无法在浏览器(html5)中播放

1、问题描述 在使用海康 SDK 的 NET_DVR_SaveRealData 接口&#xff0c;将视频流保存成MP4文件后&#xff0c;通过浏览器无法播放MP4&#xff0c;播放其它的MP4正常。 2、原因分析 对比可以正常播放的MP4 和 无法播放的MP4文件&#xff0c;比较它们的详细信息&#xff0c;发…

AI时代新词-生成对抗网络(GAN)

一、什么是生成对抗网络&#xff08;GAN&#xff09;&#xff1f; 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是一种由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;组成的深度学习模…

使用AutoKeras2.0的AutoModel进行结构化数据回归预测

1、First of All: Read The Fucking Source Code import autokeras as ak import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error# 生成数据集 np.random.seed(42) x np.random.rand(1000, 10) # 生成1…

实战设计模式之访问者模式

概述 访问者模式允许我们在不改变类的前提下&#xff0c;向已有类添加新的功能。简单来说&#xff0c;就是将算法与对象的数据结构进行分离的一种方法。在实际应用中&#xff0c;当我们需要对一组对象执行一些操作&#xff0c;而这些操作又需要随着需求的变化而不断变化时&…

centos7.9使用docker-compose安装kafka

docker-compose配置文件 services:zookeeper:image: confluentinc/cp-zookeeper:7.0.1hostname: zookeepercontainer_name: zookeeperports:- "2181:2181"environment:ZOOKEEPER_CLIENT_PORT: 2181ZOOKEEPER_TICK_TIME: 2000kafka:image: confluentinc/cp-kafka:7.0…

STM32:Modbus通信协议核心解析:关键通信技术

知识点1【 Modbus通信】 1、Modbus的概述 Modbus是OSI模型第七层的应用层报文传输协议 协议&#xff1a;说明有组包和解包的过程 2、通信机制 Modelbus是一个请求/应答协议 通信机制&#xff1a;主机轮询&#xff0c;从机应答的机制。每个从设备有唯一的地址&#xff0c;主…

LeetCode 3362.零数组变换 III:贪心+优先队列+差分数组——清晰题解

【LetMeFly】3362.零数组变换 III&#xff1a;贪心优先队列差分数组——清晰题解 力扣题目链接&#xff1a;https://leetcode.cn/problems/zero-array-transformation-iii/ 给你一个长度为 n 的整数数组 nums 和一个二维数组 queries &#xff0c;其中 queries[i] [li, ri] …

ORM++ 封装实战指南:安全高效的 C++ MySQL 数据库操作

ORM 封装实战指南&#xff1a;安全高效的 C MySQL 数据库操作 一、环境准备 1.1 依赖安装 # Ubuntu/Debian sudo apt-get install libmysqlclient-dev # CentOS sudo yum install mysql-devel# 编译时链接库 (-I 指定头文件路径 -L 指定库路径) g main.cpp -stdc17 -I/usr/i…

JESD204B 协议介绍

一、协议概述 JESD204B是由JEDEC&#xff08;固态技术协会&#xff09;制定的高速串行接口标准&#xff0c;专为模数转换器&#xff08;ADC&#xff09;、数模转换器&#xff08;DAC&#xff09;与逻辑器件&#xff08;如FPGA、ASIC&#xff09;之间的数据传输设计。其核心目标…

yolov8,c++案例汇总

文章目录 引言多目标追踪案例人体姿态估计算法手势姿态估计算法目标分割算法 引言 以下案例,基于c,ncnn,yolov8既可以在windows10/11上部署, 也可以在安卓端部署, 也可以在嵌入式端部署, 服务器端可支持部署封装为DLL,支持c/c#/java端调用 多目标追踪案例 基于yolov8, ncnn,…