图论 | 豆包MarsCode AI 刷题

107 阅读3分钟

小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。机场由一个数组airports标识,其中:

  • 数组每个元素代表一个独特的机场,元素的值代表不同的航空公司。
  • airports[0]为起点,airports[airports.length - 1]为终点。
  • 假设小C当前在机场i,那么i - 1i + 1(如果存在)代表邻近机场,飞机可以直接前往。
  • 如果在机场i,且存在airports[i] == airports[j],则机场i和机场j同属一家航空公司,可直接飞往。

求最小起飞次数。


测试样例

样例1:

输入:airports = [10, 12, 13, 12, 14]
输出:3

样例2:

输入:airports = [10, 11, 12, 13, 14]
输出:4

样例3:

输入:airports = [7, 7, 7, 8, 9, 7]
输出:1

问题分析

小C和小F需要规划一次飞行路线,从起点机场到终点机场,且要求最小化起飞次数。飞机可以飞往相邻机场或相同航空公司管理的其他机场。我们需要构建一个图来表示这些连接,并找到从起点到终点的最短路径(在这里,“最短”指的是起飞次数最少)。

解决思路

  1. 构建图的邻接表

    • 使用一个字典(或邻接表)来表示机场之间的连接关系。
    • 对于每个机场,我们需要记录它的相邻机场(即索引为i-1i+1的机场,如果存在)以及属于同一航空公司的其他机场。
    • 注意:由于题目没有直接给出如何获取同一航空公司的其他机场,我们需要在遍历过程中动态地处理这种连接,或者使用额外的数据结构(如哈希表)来存储每个航空公司管理的所有机场。然而,为了简化问题,我们可以假设在遍历图时能够动态地检查并处理这种连接。
  2. 初始化动态规划数组

    • 创建一个动态规划数组dp,其中dp[i]表示到达机场i时的最小起飞次数。
    • 初始化dp[0] = 0,因为起点机场不需要起飞。
    • 对于其他机场,将dp值初始化为一个很大的数(表示尚未到达)。
  3. 使用广度优先搜索(BFS)遍历图

    • 使用一个队列来进行广度优先搜索。

    • 将起点机场加入队列,并标记为已访问。

    • 当队列不为空时,执行以下操作:

      • 从队列中取出一个机场curr

      • 对于curr的每个相邻机场next

        • 如果next尚未被访问过,则计算从起点到next的起飞次数。
        • 如果通过curr到达next的起飞次数比当前已知的dp[next]值小,则更新dp[next],并将next加入队列并标记为已访问。
      • 注意:在更新dp[next]时,我们需要检查currnext是否属于同一航空公司。如果是,则不需要额外的起飞次数;如果不是,则需要增加一次起飞次数。

  4. 返回结果

    • 遍历完成后,dp[n-1](其中n是机场数量)即为从起点到终点的最小起飞次数。

注意事项

  • 在构建图的邻接表时,我们需要确保能够正确地处理相邻机场和同一航空公司的机场之间的连接。
  • 在使用BFS遍历图时,我们需要使用一个额外的数据结构(如集合)来跟踪已访问的机场,以避免重复访问。
  • 在更新dp值时,我们需要仔细处理起飞次数的计算,特别是当两个机场属于同一航空公司时。

通过这种方法,我们可以有效地找到从起点到终点的最小起飞次数。