形式陈述
设 G = ( L ∪ ˙ R , E ) 是有限简单二分图 公理库 二分图 Bipartite graph 顶点可分成两个独立侧、且每条边都跨越两侧的有限简单无向图。 ,记 p = | L | 、q = | R | 、n = p + q 、m = | E | 。本页求无权最大基数匹配 公理库 匹配 Matching in a graph 由彼此不共享端点的边组成、表达一对一配对约束的边集合。 ,并判断能否饱和指定的左侧。输入显式列出左右顶点与有编号的边;孤立顶点也计入 n 。
按最大流模型 公理库 最大流 Maximum flow 在容量与流守恒约束下最大化源到汇净流量的问题。 构造网络 N ,流量须满足各原弧的容量约束和内部顶点的流量守恒:加入源 s 、汇 t ;加入 s → ℓ (ℓ ∈ L )、ℓ → r (ℓ r ∈ E )及 r → t (r ∈ R ),所有容量均为 1 。网络有 n + 2 个顶点、m + n 条原弧,构造耗时和空间均为 O ( n + m ) 。归约结论是
是 的 可 行 流 ν ( G ) = max { | f | : f 是 N 的可行流 } . 双向对应与整数性
给定匹配 M ,沿每条 s → ℓ → r → t (ℓ r ∈ M )送一单位。不同匹配边没有公共端点,因此每条源弧和汇弧最多用一次;中间弧也最多用一次。各内部顶点收到多少就送出多少,故得到值为 | M | 的整数可行流。这说明最大流值至少为 ν ( G ) 。
反过来,给定整数可行流,全部原弧流量只能为 0 或 1 。左点 ℓ 唯一的入弧是 s → ℓ ,容量为 1 ;守恒迫使从它流出的中间弧至多有一条流量为 1 。右点唯一的出弧 r → t 同样保证至多一条中间入弧流量为 1 。所以选取流量为 1 的中间弧便得到匹配。对全部左点的守恒式求和,可知所选边数恰等于源的流出量,也就是 | f | 。
还须证明能找到整数最大流。Ford–Fulkerson 方法 公理库 Ford–Fulkerson 方法 Ford–Fulkerson method 沿残量网络中的增广路反复增加流量直至不存在增广路。 从整数零流开始;若当前流整数,则每条正向余量 c ( a ) − f ( a ) 和反向余量 f ( a ) 都是整数。一条正残量路径的瓶颈是正整数,按原弧身份正增、反减后仍为整数可行流。每次流值至少增加 1 ,而流值不超过有限的源出容量和,故过程终止。终态无增广路,最大流最小割定理 公理库 最大流最小割定理 Max-flow min-cut theorem 以净跨割恒等式和残量可达集证明最大流等于最小割,并给出独立可检查的最优性证书。 证明它最大。在本网络中正残量都为 1 ,每次恰增一单位。将这一整数最大流译回匹配,得到反向不等式,双向归约才闭合。
从终态搜索读出三种证书
设整数最大流对应匹配 M ,大小为 k 。残量源弧恰好通向未匹配左点;在两侧之间,非匹配边可从左向右走,匹配边可从右向左撤销。因终态不可到达 t ,源可达集可写成
U = { s } ∪ A ∪ B , A ⊆ L , B ⊆ R . 等价地,从全部未匹配左点组成的根集 Q 开始作交替搜索,得到 A , B 。若一个可达左点未匹配,它的所有邻边都能向右走;若它已匹配,其唯一匹配邻居正是搜索进入它之前经过的右点,其余邻边仍能向右走。因此 N ( A ) ⊆ B 。每个可达右点又必由某个可达左邻居进入,故 B ⊆ N ( A ) ,于是
N ( A ) = B . B 中没有未匹配右点,否则从根到它的路径可以增广。每个 B 中的点都能沿匹配边到达其伙伴;每个 A ∖ Q 中的点也正是沿这样的匹配边进入。因此匹配在 B 与 A ∖ Q 之间给出双射,且 | Q | = p − k ,所以
| A | − | B | = p − k . 当 k < p 时,A 就是Hall 条件 公理库 Hall 婚配定理 Hall's marriage theorem 有限二分图存在饱和一侧的匹配,当且仅当每个该侧顶点子集的邻集至少同样大。 的具体违例;它指出哪一群左点缺少候选,而不仅是报告失败。当 k = p 时没有搜索根,A = B = ∅ ,也没有正缺额。
再令 C = ( L ∖ A ) ∪ B 。任一原边若左端不在 A ,便被左端覆盖;若左端在 A ,其右端属于 N ( A ) = B ,仍被覆盖。因此 C 是顶点覆盖,且
| C | = p − | A | + | B | = k . 匹配中的 k 条边端点互不相交,任何覆盖至少需要 k 个点,故 C 最小。这给出 Kőnig 定理 公理库 Kőnig 二分图定理 Kőnig's theorem for bipartite graphs 二分图中最大匹配大小等于最小顶点覆盖大小。 的构造性证明。同一集合 U 没有中间弧向外跨割,跨割弧只有从 s 到 L ∖ A 及从 B 到 t 的弧,所以割容量也是 k 。
直觉
源弧与汇弧分别给每个左、右顶点一个配额;中间弧上的单位流登记一对端点。残量反向弧记录的是撤销已有配对的权利。一次长增广路 公理库 增广路 Augmenting path 相对于当前匹配,边在未匹配与已匹配之间交替且两个端点均未匹配的路径。 可以先腾出别人占用的候选,再把这串调整传到一个空闲右点,因此“没有可直接加入的边”不等于已经最优。
找不到增广路时,搜索仍提供信息:它圈出的左点已经用尽共同邻集。这个可达区域既给出短缺人群,也给出同值割;把区域外的左点与区域内的右点取在一起,就得到同大小覆盖。三份证书描述的是同一次搜索的结果。
图片加载失败 上图沿完整增广路加入向右实线边、撤销向左虚线边;下图箭头仅表示残量方向,失败搜索不改变 M0,3→d 也未被访问。删去 c3 后 A={a,b,c}、B={1,2},覆盖与割的值均为三。
例子与边界
一条需要连续改配的路径
取 L = { a , b , c , d } 、R = { 1 , 2 , 3 , 4 } ,按顺序给七条边编号:
E + = { a 1 , a 2 , b 1 , c 2 , c 3 , d 3 , d 4 } . 从零流依次沿 s − a − 1 − t 、s − c − 2 − t 、s − d − 3 − t 增广,得到 M 0 = { a 1 , c 2 , d 3 } 。剩下的每条边都碰到已匹配点,所以 M 0 极大,但未匹配的 b 与 4 之间仍有交替路
b → 1 → a → 2 → c → 3 → d → 4. 对应残量路在两端补上 s , t 。沿路撤销 a 1 , c 2 , d 3 ,加入 b 1 , a 2 , c 3 , d 4 ,得到 M + = { b 1 , a 2 , c 3 , d 4 } 。每个内部顶点在新流中恰收一单位、送一单位;四条源弧和四条汇弧均流一单位,四条所选中间弧也流一单位,其余三条中间弧流零。网络共十个顶点、十五条原弧,流值为 4 ,源割 { s } 的容量也为 4 ,所以已经最大。
删去一条边以后,失败的原因在哪里
只删去 c 3 得到 G − ,仍有四个左点、四个右点,且没有孤立点。相同的前三次增广仍得到 M 0 。从 b 搜索只能走到 1 , a , 2 , c ;空闲右点 4 虽然存在,却被缺失的 c 3 隔在交替可达区域之外。因此
A = { a , b , c } , B = N ( A ) = { 1 , 2 } , | A | − | B | = 1. A 中最多匹配两点,此外只剩左点 d ,所以任何匹配最多有三条边;M 0 恰达到这个上界。对应覆盖为 C = { d , 1 , 2 } :前四条边 a 1 , a 2 , b 1 , c 2 由 1 或 2 覆盖,后两条 d 3 , d 4 由 d 覆盖。
在十四条原弧的网络中,U = { s , a , b , c , 1 , 2 } 的跨割弧恰是 s → d 、1 → t 、2 → t ,总容量为 3 。流一单位的弧来自 s − a − 1 − t 、s − c − 2 − t 、s − d − 3 − t 三条路径,共九条。于是 Hall 缺额 1 、最大匹配 3 、最小覆盖 3 与最小割 3 全部对应同一终态。只检查全体左点会漏掉障碍:这里 N ( L ) = R ,总量四对四完全够用。
为什么要指定整数流和特定的割
在 K 2 , 2 中,两条源弧和两条汇弧各流 1 ,四条中间弧各流 1 / 2 ,得到值为 2 的最大流。若直接选取流量为 1 的中间弧,结果却是空匹配。分数最大流的值仍等于最大匹配值;失败的是这条直接提取规则。前面的整数不变量保证求解器返回适合提取的最优流,而没有断言每个最大流都整数。
全单位网络的任意最小割也不能直接变成覆盖。只有一条边 a 1 时,源侧 W = { s , a } 的割容量为 1 ,已经最小;但按 ( L ∖ ( W ∩ L ) ) ∪ ( W ∩ R ) 会得到空集,漏掉 a 1 。原因是割切断了中间弧。一般源侧 W 的容量还包含 E ( W ∩ L , R ∖ W ) 中的边数,不能删去这一项。本页使用终态整数匹配的残量可达割,并已证明 N ( A ) = B ,这才保证没有中间跨割弧。
推论与应用
产生结果与独立检查
设编号可在常数时间取到原边端点,机器字足以保存顶点、边编号和 n + m 。求解器构造邻接表和残量记录后,每次搜索与更新耗时 O ( n + m ) 。到最优值 k 恰好成功增广 k 次,另有一次失败搜索,所以总时间为 O ( ( k + 1 ) ( n + m ) ) ,空间为 O ( n + m ) 。保留孤立点时不能把每次成本无条件写成 O ( m ) 。
证书算法 公理库 证书算法 Certifying algorithm · Certificate-producing algorithm 让求解器随答案输出可独立检查的证书,并用检查器的可靠性证明已接受结果满足规格的计算接口。 把上述产生过程和下面的检查器分开。所有证书先检查长度、编号范围、集合无重复及输入引用;拒绝一份证书不等于证明相反答案。
要确认的结论
证书及接受条件
接受为何可靠
可以饱和左侧
p 个匹配边编号;每条确为输入边,左右端点均不重复
p 条边使用 p 个不同左点,恰好饱和左侧
不能饱和左侧
左点集合 A ;扫描所有边自行算出 N ( A ) ,确认 $
N(A)
最大匹配值为 k
合法匹配 M 和覆盖 C ;逐边检查至少一端在 C ,且 $
M
网络最大流值为 k
各原弧的 0 / 1 流数组与源侧 U ;检查容量、守恒、s ∈ U , t ∉ U 及 $
f
前三类证书各用 O ( n ) 个机器字,流割证书用 O ( n + m ) 个条目;集合也可用位向量保存。各检查器含输入合法性扫描均为 O ( n + m ) 时间,顶点标记和守恒累加器用 O ( n ) 辅助空间。检查不需要重跑增广;单位流的等式用精确整数比较。
在 G − 上,M 0 , C = { d , 1 , 2 } 通过最优性检查,A = { a , b , c } 通过否定检查。在 G + 上复用同一个 A ,扫描会发现边 c 3 ,算出 N ( A ) = { 1 , 2 , 3 } ,缺额条件失败。这说明检查器必须核对原输入中的全部相关边,不能只相信求解器写下的候选邻集。
算法与模型分支
Hopcroft–Karp 算法 公理库 Hopcroft–Karp 算法 Hopcroft-Karp algorithm 按阶段同时增广一族顶点不交的最短增广路,以包含孤立点读取成本的 O(V+E√V) 时间求二分图最大匹配。 直接在交替图中批量处理最短增广路;包含读取孤立点的完整时间界为 O ( n + m n ) ,空间为 O ( n + m ) 。本页的逐条增广证明仍可用来理解其残量机制,批量阶段数则需要该算法自己的分析。
若把源到某个左点的容量提高,就允许该点承担多次配对,输出已不再是本页的普通匹配。边权需要匈牙利算法 公理库 匈牙利算法 Hungarian algorithm 通过对偶标号和增广结构求解赋权二分图完美匹配的算法。 或费用流;一般图的奇圈需要开花算法 公理库 Edmonds blossom 算法 Edmonds' blossom algorithm · Blossom algorithm 通过识别并收缩奇交替环,在一般图中保持增广路存在性并求最大匹配的算法。 等方法,不能直接套用左右分层网络。二分图匹配也可视为两个划分拟阵的公共独立集,进一步接入拟阵交算法 公理库 拟阵交算法 Matroid intersection algorithm · Unweighted matroid intersection 在两个有限拟阵的交换有向图中寻找最短增广路,以独立性 oracle 构造最大公共独立集并在无路时输出秩和证书。 。
参考资料