假设你是一个项目主管,手上有n个任务和m个员工,每个员工只能胜任其中一部分任务,每项任务至多分配给一人。问最多能同时推进多少项任务?这就是典型的二分图最大匹配 问题。如果将"能否胜任"替换为"完成效率",要求总效率最高的分配方案,则对应指派问题。这两个问题构成了二分图匹配的理论核心,也在无数现实场景中发挥着作用。
一、二分图与匹配的基本定义
二分图是指顶点集可以划分为两个不相交子集 LL 和 RR,使得图中所有边均连接 LL 中一个顶点与 RR 中一个顶点,同一侧内部无边。二分性可以用无奇环来刻画:一个图是二分图当且仅当它不包含奇数长度的环。
匹配 是图中一组边的集合,其中任意两条边不共享顶点。匹配中的边称为匹配边 ,其端点称为已匹配顶点 ,其余为未匹配顶点 。若匹配覆盖了所有顶点,称为完美匹配 ;若无法再添加任何边而保持匹配性质,称为极大匹配 ;边数最多的匹配称为最大匹配。
二、最大流归约:网络流视角下的匹配
二分图最大匹配问题可以优美地转化为最大流问题。构造方法如下:
在原二分图 G=(L∪R,E)G=(L∪R,E) 的基础上,添加一个超源点 ss 和一个超汇点 tt。从 ss 向 LL 中每个顶点连一条容量为1的边,从 RR 中每个顶点向 tt 连一条容量为1的边,原图 EE 中的每条边从 LL 侧指向 RR 侧,容量同样设为1(或 ∞∞,在此等价)。
此网络上的任意一个整数流,在 LL 到 RR 的边上流量只能为0或1------容量为1约束了这一点。流量为1的边恰好构成一个匹配:每个 LL 顶点至多发出1单位流量(匹配至多一条边),每个 RR 顶点至多接收1单位流量(被至多一个 LL 顶点匹配)。流的值即为匹配的边数。由最大流最小割定理及整数流性质可知,此网络的最大流即对应二分图的最大匹配。
在这个归约框架下,第17至18篇讨论的Ford-Fulkerson、Edmonds-Karp和Dinic算法均可直接用于求解二分图最大匹配。对于二分图,Dinic算法的时间复杂度为 O(∣V∣⋅∣E∣)O(∣V∣⋅∣E∣)(Hopcroft-Karp的分析即等价于此),显著优于一般图上的 O(∣V∣2⋅∣E∣)O(∣V∣2⋅∣E∣)。不过,针对二分图的结构特点,还可以设计出更简洁、更直观的专用算法------匈牙利算法。
三、匈牙利算法:交替路与增广路
匈牙利算法是求解二分图最大匹配的经典方法,其核心思想可追溯至König和Egerváry的工作,后由Kuhn整理为完备算法。算法仅使用邻接结构,无需显式构造流网络。
算法的核心操作围绕两条路径概念展开。设当前已有一个匹配 MM,交替路 是指一条路径,其边在匹配 MM 与不在 MM 中交替出现。增广路则是一条特殊的交替路------其起点和终点均为未匹配顶点。
增广路的关键性质是:将增广路上所有边的匹配状态取反(原匹配边变为非匹配边,原非匹配边变为匹配边),匹配的边数增加1,且仍然是一个合法匹配。这是因为首尾顶点原未匹配,翻转后恰好各增加一条匹配边,而中间顶点的匹配状态保持不变。
匈牙利算法以此为基本操作,从每个 LL 中的未匹配顶点出发,尝试寻找一条以它为起点的增广路:
-
初始匹配 M=∅M=∅。
-
对 LL 中每个未匹配顶点 uu,启动一次搜索(通常用DFS),在交替路上前进,寻找能否抵达 RR 中的某个未匹配顶点。
-
若找到增广路,执行翻转操作,匹配数加1。
-
若找不到,则该顶点在后续过程中不再作为起点(Berge定理保证它永远不可能被匹配)。
每次DFS的时间为 O(∣E∣)O(∣E∣),至多执行 O(∣V∣)O(∣V∣) 次搜索,总复杂度 O(∣V∣⋅∣E∣)O(∣V∣⋅∣E∣)。实际运行中通常远小于这个上界。
四、Berge定理与König定理:理论支撑
匈牙利算法的正确性由Berge定理保证:一个匹配 MM 是最大匹配当且仅当不存在关于 MM 的增广路。必要性显然------存在增广路则可扩大匹配;充分性则需证明若 MM 非最大,必存在增广路。这一定理是匹配理论的基石,也解释了为何匈牙利算法在无法找到任何增广路时即可终止。
在二分图的理论中,还有一条同样深刻的König定理:二分图的最大匹配数等于最小顶点覆盖数。顶点覆盖是一组顶点,使得图中每条边至少有一个端点属于该集合。这一对偶关系与最大流最小割定理一脉相承------在网络流归约中,最小割直接对应最小顶点覆盖。
此外,Hall婚姻定理给出了二分图存在完美匹配的充要条件:对于 LL 的任意子集 XX,其邻居集合 N(X)N(X) 的大小至少为 ∣X∣∣X∣。这条定理在分配问题中具有直观的"瓶颈"含义------任何一组任务所需的技能种类数不得少于该组任务数,否则无法全部分配。
五、指派问题与KM算法概要
当每条边不仅表示能否匹配,还附有一个权重(收益或成本)时,问题升级为最大权完美匹配 ,也称指派问题。此时不仅要求匹配覆盖所有顶点,还要求匹配的总权重最大(或成本最小)。
Kuhn-Munkres算法(简称KM算法)是求解这一问题的经典方法,其核心思想是可行顶标 。为每个顶点 vv 维护一个顶标 l(v)l(v),满足对任意边 (u,v)(u,v),l(u)+l(v)≥w(u,v)l(u)+l(v)≥w(u,v)(求最大权时)。满足等号成立的边构成相等子图。算法通过不断调整顶标,使相等子图逐步扩大,直至包含一个完美匹配。
KM算法的标准实现时间复杂度为 O(∣V∣3)O(∣V∣3),与Floyd-Warshall在同一量级。在成本最小化版本中,通常将权重取反或使用费用流模型。若二分图两侧规模不等,可补足虚顶点并设权重为0,转化为标准形式。
六、应用与后续
二分图匹配在实际系统中的应用极为广泛。在打车平台中,乘客与司机的实时匹配可建模为二分图的最大匹配或最大权匹配;在推荐系统中,用户与物品的匹配偏好天然构成二分图;在计算广告中,广告位与广告主的分配直接对应指派问题。网络流与二分图匹配的交织,也引出了一个更一般的问题框架------带权的、带容量约束的分配,这正是最小费用最大流所处理的范畴。在后续篇章中,我们将进入这一领域,探讨费用流问题的建模与求解方法。