用 Python 编写程序,找出公路旅行中最少需要跨越国家/地区的次数
pythonserver side programmingprogramming更新于 2026/1/11 15:40:17
假设我们要计划一次公路旅行,其中包括游览不同国家/地区的多个城市。我们有一个道路列表"R",其中每个元素都描述为 (x, y, cost)。x 表示道路的出发城市,y 表示道路的目的地城市,cost 表示通过该道路旅行的费用。我们还有一个列表"C",其中每个元素都是一个国家/地区,每个元素包含该国/地区的城市。现在,我们还有一个出发城市"s"和一个目的地城市"e",我们想从出发城市前往目的地城市。有了所有这些信息,我们必须找出完成旅行所需的最少跨国旅行次数以及旅行的总费用。我们必须将这两个值打印为输出。
因此,如果输入为 R = [[0, 1, 2],[1, 2, 2], [0, 2, 3], [1, 3, 3]], C = [[0], [1], [2, 3]], s = 0, e = 3,则输出为 (2,5)。
因此,要从 0 行进到 3,我们走 0->1->3 的路径。此路径上走的路为 [0, 1, 2] 和 [1, 3, 3]。因此,国与国之间的总旅行次数为 2,总费用为 2 + 3 = 5。
为了解决这个问题,我们将遵循以下步骤 −
- cont := 一个新映射,其中默认值为 0
- 对于 C 中的每个索引 idx 和元素 item,执行
- 对于 item 中的每个 k,执行
- cont[k] := idx
- 对于 item 中的每个 k,执行
- adj_list := 一个包含列表作为值的新映射
- 对于 R 中的每个 a、b、wt,执行
- 如果 cont[a] 与 cont[b] 不同,则
- wt := wt + 10 ^ 10
- 在 adj_list[a] 末尾插入一对 (b, wt)
- 如果 cont[a] 与 cont[b] 不同,则
- distance := 一个默认值为 10 ^ 20 的新映射
- distance[s] := 0
- visited := 一个新集合
- t := 一个包含一对 (0, s) 的新堆
- 当 t 不为空时,执行
- pair (d, c) := 从堆中弹出最小项
- 如果 c 存在于访问中,则
- 进行下一次迭代
- 将 c 添加到访问中
- 对于 adj_list[c] 中的每个 j、wt,执行
- 如果 distance[j] > d + wt,则
- distance[j] := d + wt
- 将对 (d + wt, j) 插入堆 t
- 如果 distance[j] > d + wt,则
- 返回对 ((distance[e] / 10 ^ 10) 的取整值,(distance[e] mod 10 ^ 10))
示例
让我们看看下面的实现以便更好地理解 −
from collections import defaultdict from heapq import heappush, heappop def solve(R, C, s, e): cont = defaultdict(int) for idx, item in enumerate(C): for k in item: cont[k] = idx adj_list = defaultdict(list) for a, b, wt in R: if cont[a] != cont[b]: wt += 10 ** 10 adj_list[a].append((b, wt)) distance = defaultdict(lambda: 10 ** 20) distance[s] = 0 visited = set() t = [(0, s)] while t: d, c = heappop(t) if c in visited: continue visited.add(c) for j, wt in adj_list[c]: if distance[j] > d + wt: distance[j] = d + wt heappush(t, (d + wt, j)) return distance[e] // 10 ** 10, distance[e] % 10 ** 10 print(solve([[0, 1, 2],[1, 2, 2],[0, 2, 3], [1, 3, 3]], [[0],[1],[2, 3]], 0, 3))
输入
[[0, 1, 2],[1, 2, 2],[0, 2, 3], [1, 3, 3]], [[0],[1],[2, 3]], 0, 3
输出
(2, 5)
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

