1 条题解
-
0
题目分析
我们有:
- 个飞行员,编号 到
- 前 个是正驾驶员()
- 后 个是副驾驶员()
- 给定若干 表示正驾驶员 可以和副驾驶员 搭档
- 每架飞机需要 1个正驾驶 + 1个副驾驶,且每人只能在一架飞机上
目标:最多能组成多少架飞机。
建模
我们可以将问题抽象为:
- 左部 :正驾驶员集合
- 右部 :副驾驶员集合
- 边:给定的可搭配关系
这就是在二分图中找最大匹配。
算法选择
由于 ,我们可以用:
- 匈牙利算法(DFS增广)
- 时间复杂度 ,足够快
- 网络流最大流
- 建立超级源点连所有正驾驶员,所有副驾驶员连超级汇点,可搭配的连边,容量为1
- 跑最大流即可
这里我们用匈牙利算法实现更简单。
匈牙利算法步骤
- 建立邻接表
g[i]
表示左部点 能匹配的右部点列表 - 维护
match[j]
表示右部点 当前匹配的左部点(0表示未匹配) - 对每个左部点 ,执行 DFS 寻找增广路:
- 遍历 的所有邻接右部点
- 如果 未在当前 DFS 访问过,则标记访问
- 如果 未匹配,或者
match[v]
可以找到新的匹配,则让 匹配
- 统计成功匹配的数量
样例验证
输入:
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 匹配 7
- 2 匹配 6
- 3 无法匹配 7(7已被1占),但1可以换到无冲突?这里3无法抢到7,因为1没有其他选择
- 4 匹配 8
- 5 匹配 9
最终匹配:{(1,7), (2,6), (4,8), (5,9)},共4对,输出4。
复杂度分析
- 每个左部点一次DFS,最多访问所有边
- 时间复杂度:,在 时非常快
这就是该问题的完整解法。
- 1
信息
- ID
- 3142
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者