1. 匈牙利算法实战:从过山车配对到二分图匹配
第一次看到这个题目时,我忍不住笑了——这不就是现实生活中的相亲配对问题吗?女生们有自己心仪的男生名单,而我们需要找出最多能成功配对的组合。在ACM竞赛中,这类问题被称为二分图最大匹配问题,而匈牙利算法正是解决这类问题的经典方法。
匈牙利算法由匈牙利数学家Dénes Kőnig在1931年提出,虽然已经过去近百年,但它在解决匹配类问题时依然展现出惊人的效率。算法的时间复杂度为O(V*E),其中V是顶点数,E是边数,对于大多数实际问题来说已经足够高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与建模
2.1 题目场景解析
题目描述了一群学生乘坐过山车的场景,要求必须一男一女配对乘坐。每个女生有自己偏好的男生列表,我们需要找出最多可以组成多少对满足条件的组合。
这个场景可以抽象为:
- 女生集合:V1
- 男生集合:V2
- 偏好关系:边集E,连接V1和V2
2.2 二分图的概念与性质
二分图(Bipartite Graph)是指顶点集V可以划分为两个互不相交的子集V1和V2,使得图中的每条边都连接V1中的一个顶点和V2中的一个顶点。二分图的一个重要性质是:图中不包含长度为奇数的环。
在本题中:
- 女生集合和男生集合自然形成了二分图的两个部分
- 女生之间的边不存在(女生不能配对)
- 男生之间的边不存在(男生不能配对)
- 边只存在于女生和男生之间(表示配对意愿)
2.3 匹配的定义与分类
匹配是指图中一组没有公共顶点的边。在二分图匹配问题中,我们主要关注:
- 最大匹配:包含边数最多的匹配
- 完美匹配:所有顶点都被匹配的匹配(必须是|V1|=|V2|)
- 最大权匹配:边有权重时,权重和最大的匹配
本题要求的是最大匹配,即最多能组成多少对满足条件的男女组合。
3. 匈牙利算法详解
3.1 算法核心思想
匈牙利算法的核心思想是:通过不断寻找增广路径来扩大当前的匹配。增广路径是指从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边...最后到达另一个未匹配点的路径。
算法的关键步骤:
- 初始化所有顶点为未匹配状态
- 对于每个女生,尝试为她找到一个匹配的男生
- 如果男生未被匹配,直接匹配
- 如果男生已被匹配,尝试让原配女生寻找新的匹配(递归过
