带花树算法(Blossom Algorithm)

开花算法(Blossom Algorithm,也被称做带花树)可以解决一般图最大匹配问题(maximum cardinality matchings)。此算法由 Jack Edmonds 在 1961 年提出。 经过一些修改后也可以解决一般图最大权匹配问题。 此算法是第一个给出证明说最大匹配有多项式复杂度。

一般图匹配和二分图匹配(bipartite matching)不同的是,图可能存在奇环。

以此图为例,若直接取反(匹配边和未匹配边对调),会使得取反后的 不合法,某些点会出现在两条匹配上,而问题就出在奇环。

下面考虑一般图的增广算法。 从二分图的角度出发,每次枚举一个未匹配点,设出发点为根,标记为 「o」,接下来交错标记 「o」「i」,不难发现 「i」「o」 这段边是匹配边。

假设当前点是 ,相邻点为 ,可以分为以下两种情况:

  1. 未拜访过,当 是未匹配点,则找到增广路径,否则从 的配偶找增广路。
  2. 已拜访过,遇到标记「o」代表需要 缩花,否则代表遇到偶环,跳过。

遇到偶环的情况,将他视为二分图解决,故可忽略。缩花 后,再新图中继续找增广路。

设原图为 缩花 后的图为 ,我们只需要证明:

  1. 存在增广路, 也存在。
  2. 存在增广路, 也存在。

设非树边(形成环的那条边)为 ,定义花根 。 奇环是交替的,有且仅有 的两条邻边类型相同,都是非匹配边。 那么进入 的树边肯定是匹配边,环上除了 以外其他点往环外的边都是非匹配边。

观察可知,从环外的边出去有两种情况,顺时针或逆时针。

于是 缩花不缩花 都不影响正确性。

实作上找到 以后我们不需要真的 缩花,可以用数组纪录每个点在以哪个点为根的那朵花中。

复杂度分析 Complexity Analysis

每次找增广路,遍历所有边,遇到 会维护 上的点,

枚举所有未匹配点做增广路,总共

参考代码

基于高斯消元的一般图匹配算法

提示

在阅读以下内容前,你可能需要先阅读「线性代数」部分中关于矩阵的内容:

这一部分将介绍一种基于高斯消元的一般图匹配算法。与传统的带花树算法相比,它的优势在于更易于理解与编写,同时便于解决「最大匹配中的必须点」等问题;缺点在于常数比较大,因为高斯消元的 基本是跑满的,而带花树一般跑不满。

前置知识:Tutte 矩阵

定义:对于一张 个点的无向图 ,其 Tutte 矩阵 为一个 的矩阵,其中:

其中 是一个变量,因此 中共有 个变量。

在无歧义的情况下,以下将 简写为

定理(Tutte 定理): 存在完美匹配当且仅当

定理 一定为偶数,并且 的最大匹配的大小等于 的一半。

实际应用中不可能带着 个变量进行计算,不过可以取一个数域,例如取某个素数 的剩余系 ,将变量分别随机替换为 中的数,再进行计算。方便起见,在无歧义的情况下,以下用 直接指代替换后的矩阵。

定理 至多为 的最大匹配大小的两倍,并且二者相等的概率至少为

考虑到一般图最大匹配中 基本不会超过 ,实际中 数量级的素数就足够了。

由定理可知,如果只需要求最大匹配数,而无需匹配方案,那么只需要用一次高斯消元求出 即可,远比带花树简洁。不过如果需要输出方案,会稍微复杂一些,需要用到下面介绍的算法。

构造完美匹配

由 Tutte 定理和上面的定理可知,如果 存在完美匹配,那么 有很大概率满秩。方便起见,以下叙述中均省略「有很大概率」。

中标号为 的点为 ,进一步地我们有如下定理:

定理 有完美匹配。

逆矩阵与伴随矩阵

对任意 阶方阵 ,定义其伴随矩阵为 ,其中 为删去第 行第 列的余子式。换言之,设 的代数余子式矩阵为 ,则

定理:如果 可逆,那么

所以这里的 ,也就是 删去第 行第 列后的部分满秩。

换言之,如果 ,并且 ,就表明存在一个完美匹配方案包含 这条边。以下将这种边称为 可行边

由如上定理,对于一个有完美匹配的无向图 ,我们可以得到一个比较显然的暴力算法来寻找一组完美匹配:每次枚举 ,如果 是一条可行边(连边存在,并且 ),就将 加入匹配方案,并在 中都删掉这两个点,再重新计算新的

总共要做 轮,每轮都是 的,总的复杂度是 ,有点慢了。实际上我们在重新计算 时,不必每次都重新用高斯消元求逆矩阵,而是可以利用如下定理:

定理(消去定理):令

并且 , 那么就有

定理中描述的是消去第一行第一列的情况。实际上,它可以非常显然地推广到消去任意一行一列的情况,因此我们只需在算法最开始计算一次 ,后面每次删除两个点时,只需执行两次 的消去过程即可。

总共要做 轮,每轮复杂度为 ,因此上述算法可以在 的时间内找到一组完美匹配。

构造最大匹配

我们刚刚已经解决了构造一组完美匹配的问题,但是求解问题时一般需要最大匹配。

前面已经提到, 的最大匹配大小等于 的一半。如果我们能找到 的一个最大满秩子方阵,那么对子方阵对应的导出子图求出一组完美匹配,即可找到 的一组最大匹配。

换一个角度考虑,如果 有完美匹配,那么 满秩,换言之, 是线性无关的。那么如果 不是满秩的,我们可以求出 的一组线性基,然后只保留线性基对应的行列,就可以得到 的一个最大满秩子方阵。

求出最大满秩子方阵之后,再用上面的算法找出导出子图的一组完美匹配,即可得到原图的一组最大匹配。注意由于高斯消元中可能会有行的交换,因此实现时要注意维护好点的编号。

习题

参考资料

  1. Mucha M, Sankowski P.Maximum matchings via Gaussian elimination
  2. 周子鑫,杨家齐《基于线性代数的一般图匹配》
  3. ZYQN 《基于线性代数的一般图匹配算法》