阿D的最佳飞行路线探索| 豆包MarsCode AI 刷题

110 阅读2分钟

阿D的最佳飞行路线探索

题目归类

图论:无向图最短路径问题

大致思路

在本问题中,我们需要找到从起点到终点的最短飞行路线,这可以通过 广度优先搜索(BFS) 来实现。每个节点会保存从起点到达该节点的最少起飞次数,最终在到达终点时返回起飞次数。

构图思路

我们可以将问题抽象为一个无向图。节点代表机场,边代表航线。需要注意的是,航线的建立基于两种情况:

  1. 相邻的机场之间直接相连。
  2. 相同航空公司数据的机场之间相连。

BFS的优势

BFS在找到第一个可行路径时保证是最短路径,因此适合用于此类无权重最短路径的问题。通过广度优先搜索,我们可以确保在最短的飞行次数内到达目标机场。

详细步骤

1. 初始化

  • 队列 q:初始化一个队列,起点 (0, 0) 入队。这里 0 表示机场索引,0 表示起飞次数。
  • 访问集合 visited:初始化一个集合来记录已访问的机场,起始包含机场索引 0

2. BFS 循环

  • 取队列头:从队列中取出当前机场 (idx, cnt),其中 idx 是当前机场的索引,cnt 是起飞次数。
  • 终点判断:如果当前机场是终点,返回 cnt,表示达成目标所需的最少起飞次数。
  • 邻接机场遍历:如果当前机场不是终点,将该机场的邻接机场及同一航空公司的其他机场加入队列,前提是这些机场未访问过。

3. 处理相邻机场

为了避免遗漏所有可能的飞行路线,处理相邻机场的步骤如下:

  • 正向邻接:如果 idx + 1 存在且未访问,则将其加入队列并标记为已访问。
  • 反向邻接:如果 idx - 1 存在且未访问,同样将其加入队列并标记为已访问。

4. 处理同一家航空公司的机场

  • 遍历所有机场,找到与当前机场相同航空公司的其他机场。如果这些机场尚未访问,将它们加入队列并标记为已访问,以便在下一层搜索时继续扩展。

5. 返回结果

在所有路径中,至少存在一条路径到达终点。BFS的性质保证了第一条找到的路径就是最短路径,因此可以在找到终点时直接返回起飞次数 cnt