阿D的最佳飞行路线探索
题目归类
图论:无向图最短路径问题
大致思路
在本问题中,我们需要找到从起点到终点的最短飞行路线,这可以通过 广度优先搜索(BFS) 来实现。每个节点会保存从起点到达该节点的最少起飞次数,最终在到达终点时返回起飞次数。
构图思路
我们可以将问题抽象为一个无向图。节点代表机场,边代表航线。需要注意的是,航线的建立基于两种情况:
- 相邻的机场之间直接相连。
- 相同航空公司数据的机场之间相连。
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。