华为OD机考双机位C卷 - 快递员的烦恼 (Java & Python & JS & GO & C++ & C)
快递员的烦恼
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最例短路径, 告诉他最短路径的距离。
注意:
-
不限制快递包裹送到客户手中的顺序,但必须保证都送到客户手中
-
用例保证一定存在投递站到每位客户之间的路线,但不保证客户与客户之间有路线,客户位置及投递站均允许多次经过。
-
所有快递送完后,快递员需回到投递站
输入描述
首行输入两个正整数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表示无法访问所有客户。
-
在这个过程中, 动态规划 用于存储和更新到达每个客户集合状态的最短距离,而 广度优先搜索 用于遍历所有可能的客户访问顺序。动态规划数组的索引表示客户访问的状态(使用位掩码表示哪些客户已被访问),值表示到达该状态的最短距离。通过结合这两种方法,算法能够有效地找到访问所有客户并返回配送站的最短路径。
扩展:
位掩码(Bitmask)是一种利用位操作(比如位与、位或、位非等)来处理数据的技术。在编程中,位掩码通常用于以下目的:
-
表示状态集合 :
- 通过单个整数的不同位来表示多个状态或选项。例如,如果有 4 个选项,可以用一个 4 位的数字来表示这些选项的开启或关闭状态(0 表示关闭,1 表示开启)。如
1010可以表示第一个和第三个选项被选中。
- 通过单个整数的不同位来表示多个状态或选项。例如,如果有 4 个选项,可以用一个 4 位的数字来表示这些选项的开启或关闭状态(0 表示关闭,1 表示开启)。如
-
高效的状态操作 :
- 位掩码允许使用位操作来高效地改变、查询或比较状态。例如,使用位与操作 (
&) 检查特定位的状态,使用位或操作 (|) 设置状态,使用位异或操作 (^) 切换状态。
- 位掩码允许使用位操作来高效地改变、查询或比较状态。例如,使用位与操作 (
-
节省空间 :
- 相比于使用多个布尔变量或者数组,位掩码通过将多个状态压缩在一个整数内,能更加节省空间。
在本题中位掩码用于表示不同客户的访问状态。每个位对应一个客户,如果该位为1,则表示相应的客户已被访问;如果为0,则表示客户未被访问。
浙公网安备 33010602011771号