1 条题解

  • 0
    @ 2025-10-15 14:37:24

    题目分析

    我们有:

    • nn 个飞行员,编号 11nn
    • mm 个是正驾驶员(1m1 \dots m
    • nmn-m 个是副驾驶员(m+1nm+1 \dots n
    • 给定若干 (a,b)(a,b) 表示正驾驶员 aa 可以和副驾驶员 bb 搭档
    • 每架飞机需要 1个正驾驶 + 1个副驾驶,且每人只能在一架飞机上

    目标:最多能组成多少架飞机。

    建模

    我们可以将问题抽象为:

    • 左部 LL:正驾驶员集合 {1,2,,m}\{1,2,\dots,m\}
    • 右部 RR:副驾驶员集合 {m+1,m+2,,n}\{m+1, m+2, \dots, n\}
    • 边:给定的可搭配关系 (a,b)(a,b)

    这就是在二分图中找最大匹配

    算法选择

    由于 n100n \leq 100,我们可以用:

    1. 匈牙利算法(DFS增广)
      • 时间复杂度 O(n×e)O(n \times e),足够快
    2. 网络流最大流
      • 建立超级源点连所有正驾驶员,所有副驾驶员连超级汇点,可搭配的连边,容量为1
      • 跑最大流即可

    这里我们用匈牙利算法实现更简单。

    匈牙利算法步骤

    1. 建立邻接表 g[i] 表示左部点 ii 能匹配的右部点列表
    2. 维护 match[j] 表示右部点 jj 当前匹配的左部点(0表示未匹配)
    3. 对每个左部点 uu,执行 DFS 寻找增广路:
      • 遍历 uu 的所有邻接右部点 vv
      • 如果 vv 未在当前 DFS 访问过,则标记访问
      • 如果 vv 未匹配,或者 match[v] 可以找到新的匹配,则让 uu 匹配 vv
    4. 统计成功匹配的数量

    样例验证

    输入:

    10 5
    1 7
    2 6
    2 10
    3 7
    4 8
    5 9
    

    构建的二分图:

    • 1 → 7
    • 2 → 6, 10
    • 3 → 7
    • 4 → 8
    • 5 → 9

    匹配过程(一种可能):

    1. 1 匹配 7
    2. 2 匹配 6
    3. 3 无法匹配 7(7已被1占),但1可以换到无冲突?这里3无法抢到7,因为1没有其他选择
    4. 4 匹配 8
    5. 5 匹配 9

    最终匹配:{(1,7), (2,6), (4,8), (5,9)},共4对,输出4。

    复杂度分析

    • 每个左部点一次DFS,最多访问所有边
    • 时间复杂度:O(m×(n+m))O(m \times (n+m)),在 n100n \leq 100 时非常快

    这就是该问题的完整解法。

    • 1

    信息

    ID
    3142
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者