【算法分析与设计】第19篇:二分图匹配与指派问题

假设你是一个项目主管,手上有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 中的未匹配顶点出发,尝试寻找一条以它为起点的增广路:

  1. 初始匹配 M=∅M=∅。

  2. 对 LL 中每个未匹配顶点 uu,启动一次搜索(通常用DFS),在交替路上前进,寻找能否抵达 RR 中的某个未匹配顶点。

  3. 若找到增广路,执行翻转操作,匹配数加1。

  4. 若找不到,则该顶点在后续过程中不再作为起点(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,转化为标准形式。


六、应用与后续

二分图匹配在实际系统中的应用极为广泛。在打车平台中,乘客与司机的实时匹配可建模为二分图的最大匹配或最大权匹配;在推荐系统中,用户与物品的匹配偏好天然构成二分图;在计算广告中,广告位与广告主的分配直接对应指派问题。网络流与二分图匹配的交织,也引出了一个更一般的问题框架------带权的、带容量约束的分配,这正是最小费用最大流所处理的范畴。在后续篇章中,我们将进入这一领域,探讨费用流问题的建模与求解方法。

相关推荐
IT_陈寒34 分钟前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
Jack203 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
jooloo4 小时前
Codex 间歇性 400 之谜:一条对话里,它为什么有时候用 chat/completions,有时候切到 responses?
人工智能
用户5191495848455 小时前
OpenSSL PKCS#12 PBMAC1 堆栈缓冲区溢出漏洞 (CVE-2025-11187) 分析与验证
人工智能·aigc
小小杨树5 小时前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
用户5191495848456 小时前
HP Sound Research SECOMNService 权限提升漏洞利用工具
人工智能·aigc
用户018349301696 小时前
给 AI 智能体能力包一层 BFF,前端只调一个接口
人工智能
这token有力气9 小时前
Function Calling 格式漂移
人工智能
onething3659 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
onething36510 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 6 —— 业务完善 + 会话消息预览
人工智能·后端·全栈