图论笔记1 匹配

事实上第一篇应该是一些概念的介绍,不过先不管了...

这几周讲了一个很大(也是很难)的题目,值得好好记录一下.....

本文讲的都是有限图,在阅读之前默认读者有基本的集合论姿势和图论前置姿势

匹配(Matching)

定义

匹配

对于给定的图 \(G=(V,E)\),若存在边集\(M\)使得 \(M\subseteq E(G)\) 且 \(\forall e_1,e_2\in E(G)\) 都有 \(e_1\cap e_2=\varnothing\),那么我们称 \(M\) 为 \(G\) 的一个匹配。特别地,若 \(|M|=||G||\) 则称 \(M\) 为一个完美匹配(Perfect Matching);若 \(M\) 有最大基数,则称其为最大基数匹配;类似的还有极大匹配等等

一个完美匹配有时也被称为一个1-因子(1-factor),其含义为图 \(G\) 存在1-正则的支撑子图

我们一般不明显区分匹配对应的边集和子图,而只在需要的时候作出说明

增广路

考虑 \(G\) 的一个匹配 \(M\),我们称点 \(x\) 是*的(free vertex)当且仅当 \(x\not\in V(M)\)

若\(xy\in E(G)\),我们称边 \(xy\) 是匹配边(matched edge)当且仅当 \(xy\in E(M)\);否则称其为非匹配边(unmatched edge)

若一条路 \(P\) 中总是交替地出现匹配边和非匹配边,则我们称 \(P\) 为一条交错路(alternating path)

若一条交错路 \(P'\) 以*点开始和结束,则我们称 \(P'\) 为增广路(augmenting path)

性质

  1. \(G\) 存在完美匹配的必要条件是 \(|G|=2k,\;k\in\N^+\),这个是显然的
  2. 若 \(P\) 是增广路,则\(|P|=|E(P)|=2k+1,\; k\in\N^+\)
  3. 若 \(M\) 是 \(G\) 的一个匹配,\(P\) 是 \(G\) 中的增广路,则\(M\oplus P\) 仍然是 \(G\) 的一个匹配,且\(|M\oplus P|=|M|+1\)
  4. \(M\) 为最大匹配**当且仅当 **\(G\) 不存在增广路

性质3的证明:

考虑 \(M\oplus P\) 的含义,即将 \(P\) 中的匹配边与非匹配边互换。由性质2和增广路的定义可知,这样做会使得匹配边数量增加1

性质4的证明:

\(\Rightarrow\):

由反证法,若 \(G\) 存在增广路,则根据性质3可得到基数更大的匹配,矛盾;

\(\Leftarrow\):

由反证法,若 \(M\) 不是最大基数匹配,则设最大匹配为 \(M'\),那么 \(M'\neq M\)。记\(M''=M'\oplus M\),则 \(\forall x\in V(M''),\; deg(x)\in\left\{0,1,2\right\}\)

即 \(M''\) 中只能有若干孤立的点、不相交的路、不相交的圈。除孤立点外,路和圈上的边都交替地属于 \(M\) 和 \(M'\)(这一点可以轻松地由反证法得到)。

且由 \(|M'|>|M|\) 可知,必然存在至少 \(|M'|-|M|\) 条以 \(M'\) 中的边为起点和终点的不相交的路,这些就是增广路。

性质4告诉我们可以通过不断寻找增广路来扩充现有的匹配。下面的伪代码给出了一个寻找最大匹配的算法

input(G);
M = {};
while (exists_augmenting_path(G)) {
    P = get_augmenting_path(G);
    M = M xor P;
}
output(M);

由于图有限,故这个算法能在有限步骤内结束,并且算法结束当且仅当不存在增广路,即我们找到了一个最大匹配。

二分图(bipartite graph)匹配

也叫二部图匹配

性质

  1. 二分图不含奇环
  2. 二分图中的增广路一定以某一点集中的*点为起点,途中经过若干非*点(可以为0),最后结束于另一点集的*点

Hall's Theorem:

二分图 \(G=(A\cup B,E)\) 存在浸润/饱含(saturate) \(A\) 的匹配当且仅当 \(\forall S\subseteq A\),都有\(|N(S)|\geqslant |S|\)

这个定理给出了判断二分图是否存在完美匹配的判定

Hall's Theorem的证明:

必要性是显然的;

充分性在 \(|A| = 1\) 时显然成立

由数学归纳法,不妨假设当 \(|A|< n\) 时成立,则当\(|A|=n\)时对$ G'=G-v$进行讨论:

  1. 若 \(\forall S\subseteq A',\; |N(S)|\geqslant |S|+1\),那么此时我们将 \(v\) 和它相邻的任意节点放在 \(M\) 中,于是对 \(\forall S'\subseteq A\),\(N(S')\geqslant |S|\)。由归纳假设,\(G'\) 的匹配 \(M'\) 和 \(v\) 分配的边一起构成了 \(G\) 中浸润 \(A\) 的匹配。
  2. 若 \(\exists S\subseteq A\) 使得 \(|N(S)|=|S|\),那么此时将 \(S-N(S)\) 边全部加入 \(M\) 中,且 \(G-S-N(S)\) 满足 Hall条件 ,于是将两部分合并即得到 \(G\) 中浸润 \(A\) 的匹配。

匈牙利算法

对于二分图,我们按照任意顺序枚举 \(A\) 中的每个*点( \(B\) 中也一样)作为起点进行 DFS,规定只能走交错路。若以某个点为起点找到了一条增广路,那么就沿着路径取反。

input(G);
for (i in V) {
    if (free(i)) {
        if (exists_augmenting_path(i)) {
            M = M xor augmenting_path(i);
            ans ++;
        }
    }
}
output(ans);

复杂度分析

单次循环时间复杂度为\(O(|V|+|E|)\),总共只会做 \(O(|V|)\) 次循环,故总的时间复杂度是 \(O\left({\left|V\right|\left({\left|V\right|+\left|E\right|}\right)}\right)\) 的

正确性的证明

实际上我们需要证明为什么只做 \(O(|V|)\) 次循环足够找到答案

注意到二分图 \(G\) 中的增广路的性质2,我们claim:若不存在以*点 \(v\) 为起点的增广路,则以 \(A\) 中其余*点为起点的增广路一定不会经过 \(v\)

由反证法:不妨假设经过 \(v\),则*点 \(v\) 一定位于增广路的终点,而这恰与增广路长度为奇数矛盾;故假设不成立。

HopCroft Karp 算法

一个比较直观的想法就是同时进行多条增广路的寻找,这就是HK算法的大致思想。

HK算法包含若干轮,其中每一轮的流程如下:

对于点集 \(A\),寻找出所有*点并记为 \(S\)。每次寻找出 \(B\) 中与 \(S\) 相邻,且由匹配边连接的点集 \(S'\),令 \(S\leftarrow S'\)

再在 \(A\) 中寻找与 \(S\) 相邻且由非匹配边连接的点集 \(S''\),令 \(S=S''\)

....

input(G);
while (find_augmenting_path(G)) {
   	S = maximal_shortest_augmenting_path(G);
    M = M xor S;
    ans += size(S);
}
output(ans);

不难发现,这个算法每一轮至少找到一条增广路

时间复杂度的证明

正确性的证明是比较显然的,算法结束当且仅当找不到新的增广路。

这个证明很难,是看了论文才会的.....

引理一:

\(M\) 和 \(M'\) 是 \(G\) 的两个匹配,且 \(|M|< |M'|\),则 \(M'\oplus M\) 是 \(G\) 中 \(|M'|-|M|\) 条相对于 \(M\) 的点不相交的增广路的集合

引理一的证明有点类似于匹配性质4的证明

注意到 \(M'\oplus M\) 中只会有点、路和圈,且任意路和圈上的边都在 \(M'\) 和 \(M\) 中交替出现。且任意路满足其上来自 \(M\) 和 \(M'\) 的边的数量相差恰好1。因为 \(|M|<|M'|\) ,所以至少存在 \(|M'|-|M|\) 条点不相交的增广路。

引理二:

设 \(M\) 是一个匹配,\(P\) 是 \(G\) 中相对于 \(M\) 的一条最短增广路,\(P'\) 是 \(G\oplus P\) 的一条增广路。那么有 \(|P'|\geqslant |P|+2|P'\cap P|\)

引理二的导出非常关键,这个观察也太强了.....

不妨记 \(N=M\oplus P\oplus P'\),则 \(|N|=|M|+2\Rightarrow |N|-|M|=2\)

于是 \(N\) 和 \(M\) 分别是 \(G\) 的两个匹配,且 \(|M|<|N|\),因此 \(M\oplus N\) 是 \(G\) 中相对于 \(M\) 的 \(2\) 条点不相交的增广路的集合,不妨设为 \(P_1\) 和 \(P_2\)。

又 \(P\oplus P'=N\oplus M\),故 \(|P'|+|P|-2|P\cap P'|=|P\oplus P'|=|N\oplus M|\geqslant |P_1\cup P_2|=|P_1|+|P_2|\geqslant 2|P|\)

最后一个不等号利用了 \(P\) 是最短增广路的假设

于是移项合并就有 \(|P'|\geqslant |P|+2|P\cap P'|\)

引理三:

在HK算法中,每一轮操作找出的极大的点不相交的最短增广路集合中的增广路长度单调递增

引理三由引理二直接导出,并且能直接证明时间复杂度

根据算法的描述,每一轮都将在匹配 \(M\) 的基础上找出一个极大的点不相交的最短增广路集合。不妨记 \(P=\left\{{\;P_1,P_2\ldots P_k\;}\right\}\),\(l=|P_i|\)

记 \(N=M\oplus P_1\oplus P_2\ldots P_k\),设 \(p\) 是 \(G\) 相对于 \(M\) 的一条增广路,我们分两类情况讨论:

  1. \(p\) 和 \(P\) 中的任意路不相交,则必然有 \(|p|> l\)。否则令\(P'=P+p\) ,这将与 \(P\) 的极大性和最短性矛盾。
  2. \(p\) 和 \(P\) 中的某些路相交,则根据引理二有 \(|p|\geqslant |P_i|+2|p\cap P_i|> |P_i|=l\)

故综合1、2有:下一轮新增的增广路长度严格递增

引理四:

寻找出极大的点不相交的最短增广路集合的时间复杂度为 \(O(|V|+|E|)\)

这个证明非常简单,只需要注意到每条边、每个顶点只会被访问一次就好了

时间复杂度的证明:

证明的想法十分常见,不过在这里严格证明需要证明引理二。

首先claim算法只会进行 \(O(\sqrt{|V|})\) 轮

  1. 在前 \(\sqrt {|V|}\) 轮,每一轮都将找到若干增广路,且每一轮找到的增广路长度至少增加 \(1\)
  2. 从第 \(\sqrt {|V|}+1\) 轮起,每一轮找到的增广路长度都至少为 \(\sqrt {|V|}\) ,而总结点数量为 \(|V|\),故剩余的增广路数量不会超过 \(\sqrt {|V|}\) 条。又该算法每一轮至少找到一条增广路,故算法最多再进行 \(\sqrt{|V|}\) 轮

由于每一轮寻找集合的复杂度是 \(O(|V|+|E|)\) 的,因此总的时间复杂度就是 \(O\left({\sqrt{|V|}\left({|V|+|E|}\right)}\right)\) 的

碎碎念

敏感的朋友可以能已经发现这实际上就是流量全为 \(1\) 的dinic算法了。因此在实践中直接写网络流的话复杂度也是很优秀的。

一般图匹配

一般图的完美匹配也叫一般图的1-因子

性质

  1. 没有特别好的性质
  2. 很显然 \(|G|\) 为偶数是存在完美匹配的必要条件,下面我们将忽略 \(|G|\) 为奇数的情况(这是平凡的)

Tutte's Theorem:

图 \(G\) 有完美匹配的充要条件是 \(\forall S\subseteq V(G)\),\(q(G-S)\leqslant |S|\)
其中 \(q(G')\) 表示子图 \(G'\) 中,奇数size连通分量的数量。\(G-S\) 表示删去 \(S\) 中的顶点及从 \(S\) 中连出的所有边后剩余的图

"\(\Leftarrow\)":
若 \(G\) 存在完美匹配,则 \(\forall S\subseteq V(G)\),记 \(G-S\) 形成的奇分量构成的集合为 \(C_O\),偶分量构成的集合为 \(C_E\)

取 \(c_o\in C_O\),很显然 \(c_o\) 中至少有一个点无法在分量内部匹配,因此必须有至少一条边从 \(c_o\) 连向 \(S\)。

不妨假设 \(|S| < q(G-S)\) ,那么必然不存在奇分量到 \(S\) 的完美匹配,这与 \(G\) 存在完美匹配矛盾。

"\(\Rightarrow\)":
我们称不满足 Tutte 条件的集合 \(S\) 为坏集合
由反证法,假设 \(G\) 不存在完美匹配,接下来将证明 \(G\) 存在一个坏集合(即导出和条件的矛盾)

引理一:

若 \(G\) 有一个坏集合 \(S\),则它也是 \(G\) 所有生成子图(支撑子图) 的坏集合。

注意到 \(S\) 为坏集合的含义是 \(|S| < q(G-S)\),且由 \(G\) 的生成子图 \(G'\) 能通过删去 \(G\) 中的若干条边得到,\(G-S\) 中的奇分量的数目在删边之后不会减少(讨论分裂、不分裂的情况),因此仍然不满足 Tutte 条件,是坏集合。

由引理一我们可以取 \(G\) 为不存在完美匹配的边极大图。倘若我们能证明 \(G\) 有一个坏集合,那么 \(G\) 的支撑子图(生成子图)也必然有一个坏集合

引理二:

若 \(G\) 为不存在完美匹配的边极大图且 \(G\) 存在一个坏集合 \(S\),则

  1. \(G-S\) 的所有分量为完全图(否则加边仍然不改变 \(S\) 为坏集合的性质,这与边极大矛盾)
  2. \(\forall v\in S\),都有 \(N_G(v)=V(G)-v\) (否则加边仍然不改变 \(S\) 为坏集合的性质,这与边极大矛盾)

即,引理二揭示了 \(S\) 是坏集合的必要条件,我们很自然地猜想这个条件是不是充分的。

引理三:

在 不存在完美匹配的边极大图 \(G\) 中,满足引理二条件的集合 \(S\subseteq V(G)\) 是坏集合

由反证法,不妨假设集合 \(S\) 满足引理二条件却不是坏集合,则我们可以把 \(G-S\) 中偶分量内部两两配对,奇分量两两匹配后多余点连向 \(S\) 中,最后将 \(S\) 中未配对的点两两配对。
因为 \(S\) 不是坏集合,因此 \(|S|>q(G-S)\) ,即按照上述配对方案 \(G\) 存在完美匹配,这与我们对 \(G\) 的假设矛盾。

注意到我们的目标是证明 \(G\) 存在一个坏集合,因此我们构造出一个集合 \(T=\left\{\; v\mid N(v)=V(G)-v \;\right\}\),下面将证明集合 \(T\) 就是坏集合。

由反证法,不妨假设 \(T\) 不是坏集合。则由 \(T\) 的构造方法可知 \(G-T\) 的所有分量不是完全图。
即从某一分量取点对 \(a,a'\),有 \(aa'\not\in E(G)\)

不妨记 \(a,b,c\) 为某一连通 \(a-a'\) 的最短路 \(P\) 上的前三个顶点,则由 \(P\) 的最短性可知 \(ab,bc\in E(G)\and ac\not\in E(G)\)

又由于 \(b\not\in T\),因此存在 \(d\in V(G)\) 使得 \(bd\not\in E(G)\)

因为 \(G\) 是边极大的无完美匹配图,因此 \(G+ac\) 必然存在完美匹配 \(M_1\),同理 \(G+bd\) 也存在完美匹配 \(M_2\)。

并且我们有如下观察:\(ab\not\in M_1\and ab\not\in M_2\), \(bc\not\in M_1\and bc\not\in M_2\)。这个结论可以由 \(ac\in M_1\) 和 \(bd\in M_2\) 直接导出(反证法)

取从 \(d\) 出发的一条路 \(Q\),\(Q\) 满足:

  1. \(Q\) 是一条极长路
  2. \(Q\) 中的第一条边在匹配 \(M_1\) 中
  3. \(Q\) 中交替出现 \(M_1,\; M_2\) 中的边

考虑 \(Q\) 会在哪里结束,记为 \(v\),对 \(Q\) 的最后一条边 \(e\) 作讨论:

  1. 若 \(e\in M_1\),则 \(v=b\),因为 \(a,c\) 都在 \(M_1\) 中为匹配点。此时 \(Qbd\) 构成了一个偶圈,构造 \(M=M_2\oplus Qbd\) 就得到了不含 \(ac\) 和 \(bd\) 的一个完美匹配,这与 \(G\) 不存在完美匹配矛盾;
  2. 若 \(e\in M_2\),则 \(v=a\) 或 \(v=c\),因为 \(b\) 在 \(M_2\) 中为匹配点。
    1. 若 \(Q\) 结束于 \(a\),则此时取 \(Qbd\) 为一个偶圈,则 \(M=M_2\oplus Qbd\) 就得到了不含 \(ac\) 和 \(bd\) 的一个完美匹配
    2. 类似地,我们可以讨论 \(Q\) 结束于 \(c\) 的情况,得到类似的结论

因此无论如何都将得到矛盾(\(G\) 中存在完美匹配),故 \(T\) 是一个坏集合。

这样我们就证明了 Tutte 定理。

一般图匹配算法——带花树

一般图因为存在奇圈,因此不能随便使用匈牙利算法(why?)

一个实现求一般图最大匹配的算法是带花树算法,但是讲这个要用到并查集....再说吧(

上一篇:P4551 最长异或路径 题解


下一篇:Leetcode.697. 数组的度---哈希map存储