华为OD机考双机位C卷 - 快递员的烦恼 (Java & Python & JS & GO & C++ & C)

快递员的烦恼

2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷

华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

题目描述

快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最例短路径, 告诉他最短路径的距离。

注意:

  1. 不限制快递包裹送到客户手中的顺序,但必须保证都送到客户手中

  2. 用例保证一定存在投递站到每位客户之间的路线,但不保证客户与客户之间有路线,客户位置及投递站均允许多次经过。

  3. 所有快递送完后,快递员需回到投递站

输入描述

首行输入两个正整数n,m。

接下面n行,输入快递公司发布的客户快递信息,
格式为:客户id 投递站到客户之间的距离distance

再接下来的m行,是快递员自行查找的客户与客户之间的距离信息,
格式为:客户1id 客户2id distance

在每行数据中,数据与数据之间均以单个空格分割

规格;
0 < n <=10
0 <= m <= 10
0< 客户id <= 1000
0< distance <= 10000

输出描述

最短路径距离,如无法找到,请输出 -1

用例1

输入

2 1
1 1000
2 1200
1 2 300

输出

2500

说明

路径1: 快递员先把快递送到客户1手中,接下来直接走客户1到客户2之间的直通路线,最后走投递站与客户2之间的路,回到投递站,距离为1000 + 300 + 1200 = 2500
路径2: 快递员先把快递送到客户1手中,接下来回快递站,再出发把客户2的快递送到,在返回到快递站,距离为:1000 + 1000 + 1200 + 1200 = 4400

路径3:快递员先把快递送到客户2手中,接下来直接走客户2到客户1之间的直通线路,最后走投递站和客户1之间的路,回到投递站,距离为1200 + 300 + 1000 =2500

其他路径……

所有路径中,最短路径距离为2500

用例2

输入

5  1
5 1000
9 1200
17 300
132 700
500 2300
5 9 400

输出

9200

说明:在所有可行的路径中,最短路径长度为1000 + 400 + 1200 + 300 + 300 + 700 + 700 + 2300 + 2300 = 9200

解题思路

  • 读取每个客户的ID和该客户到配送站的距离,更新距离矩阵和映射字典。

  • 读取额外路线信息,更新距离矩阵中客户之间的距离。

  • 创建一个动态规划数组,用于记录到达每个状态(客户的访问情况)的最短距离。

  • 初始化一个队列,用于执行广度优先搜索(BFS)。

  1. 广度优先搜索和动态规划

    • 从配送站开始,对每个可能的客户位置进行搜索。

    • 对于当前位置,遍历所有其他客户位置,检查是否存在一条到达下一个客户的路线。

    • 计算到达下一个客户的新状态,如果该状态未被访问过或者可以通过更短的距离到达,则更新动态规划数组。

    • 将新状态加入队列,以便继续搜索。

  2. 搜索结束条件

    • 当队列为空时,搜索结束。
  3. 输出结果

    • 从动态规划数组中获取访问所有客户并返回配送站的最短距离。

    • 如果最短距离不是无穷大,则存在有效路径,输出最短距离;否则输出-1表示无法访问所有客户。

在这个过程中, 动态规划 用于存储和更新到达每个客户集合状态的最短距离,而 广度优先搜索 用于遍历所有可能的客户访问顺序。动态规划数组的索引表示客户访问的状态(使用位掩码表示哪些客户已被访问),值表示到达该状态的最短距离。通过结合这两种方法,算法能够有效地找到访问所有客户并返回配送站的最短路径。

扩展:

位掩码(Bitmask)是一种利用位操作(比如位与、位或、位非等)来处理数据的技术。在编程中,位掩码通常用于以下目的:

  1. 表示状态集合

    • 通过单个整数的不同位来表示多个状态或选项。例如,如果有 4 个选项,可以用一个 4 位的数字来表示这些选项的开启或关闭状态(0 表示关闭,1 表示开启)。如 1010 可以表示第一个和第三个选项被选中。
  2. 高效的状态操作

    • 位掩码允许使用位操作来高效地改变、查询或比较状态。例如,使用位与操作 ( & ) 检查特定位的状态,使用位或操作 ( | ) 设置状态,使用位异或操作 ( ^ ) 切换状态。
  3. 节省空间

    • 相比于使用多个布尔变量或者数组,位掩码通过将多个状态压缩在一个整数内,能更加节省空间。

在本题中位掩码用于表示不同客户的访问状态。每个位对应一个客户,如果该位为1,则表示相应的客户已被访问;如果为0,则表示客户未被访问。

posted @ 2026-03-10 12:11  华为od算法大师  阅读(1)  评论(0)    收藏  举报