[杂谈] 关于二分图完美匹配 , 行列式和 FWT
摘要
用随机化方法判定二分图完美匹配存在性 .
用 FWT 处理带集合幂级数矩阵的行列式 .
这东西真的好玩啊 , 改完苍穹计划赶紧来记一下 .
二分图完美匹配
众所周知我们有匈牙利算法和网络流来解决一个图的二分图匹配问题 , 同理 , 平凡的二分图完美匹配 , 也可以运用这两种算法求解 .
不过这两种算法没有什么优美的性质 , 在一些并行性问题上比较疲软 .
因为这两种算法里都在求增广路 , 这样一个具有一定程度贪心性质的东西 , 放在一些并行问题里就很菜了 .
LGV 引理 , 还有行列式
总所周知 LGV 引理提供了在 DAG 上所有集合 \(A\to B\) 的不交路径路径权值积的带符号和 . 换个视角来看 , 把二分图看作这个 DAG , 可以理解成所有完美匹配的边权积的带符号和 .
可以发现 LGV 引理和完美匹配问题天然相性很好 . ( 其实直接从行列式的定义角度也可以得知上述结论 , 或许套进 LGV 会容易接受一些 ? ) .
这个形式可以用来判定完美匹配的存在性 : 考虑把边 \(i\to j\) 的边权视作变量 \(x_{i,j}\) 构造矩阵 \(G\) , 那么其行列式就是一个 \(n^2\) 元多项式 . 根据 LGV 引理的意义 , 如果完美匹配不存在 , 那么这个多项式恒等于 \(0\) . 相反 , 如果完美匹配存在 , 那么总存在一种赋值方式 , 使得所有完美匹配的带符号权值和非 \(0\) , 也就是这个多项式至少有一项系数非 \(0\) .
总结来说 , 就是 \(det(G)\ne0 \Longleftrightarrow\) 存在完美匹配 .
考虑如何判定这一点 , 可以通过随机化算法 , 给每个 \(x_{i,j}\) 带入一个随机权值 , 如果行列式不为 \(0\) , 显然就满足 \(det(G)\ne 0\) , 否则存在两种情况 : \(det(G)=0\) 恒成立或者恰好得到了 \(det(G)=0\) 的一组解 . 不妨就认为 \(det(G)=0\) 恒成立 .
为了说明这种做法的正确性 , 引入Schwartz-Zippel 引理 .
Schwartz-Zippel 引理 :
多元 \(d\) 次多项式 , 假设所有变量都从集合 \(S\) 中随机选取 , 则其值为 \(0\) 的概率 \(\begin {aligned}\le \frac{d}{|S|}\end {aligned}\) .
我们的最高次数为 \(n\) , 假设我们在模大质数 \(P\) 意义下计算 , 正确率 \(\begin {aligned}\le \frac{d}{|S|}\end {aligned}\) 十分可观 , 只需 \(O(1)\) 次验证就可以极大概率得到正确结果 .
除了判定完美匹配方面 , 这个结论也可以用于任意多元多项式恒等于 \(0\) 的判定 .
乍一看 , 这个判定需要 \(O(n^3)\) 的复杂度 , 劣于网络流判断 .
但是由于行列式性质比较好 , 这个权值不仅可以是一般的数 , 也可以是多项式 , 这赋予了这种算法更高的可扩展性 .
举个例子 , 假设有若干条边是特殊边 , 我们需要对包含特殊边边数为 \(1\cdots k\) 的情况判断存在性 . 那么可以让非特殊边权值为常数 \(b\) , 特殊边权值为 \(kx+b\) , 把权值视作关于 \(x\) 的多项式来计算 , 那么 \(x^k\) 是否系数为 \(0\) 就表示是否有特殊边边数为 \(k\) 的方案 .
除此之外 , 例如二进制卷积之类的 , 也可以套用在这里 .
矩阵和 FWT
先提一下 , 把二进制积当成乘法操作是良定义的 , 甚至可以和普通乘法搞在一起 :
其中 \(x,y\) 是变量 .
我们把这个形式的乘法和普通加法配合 , 仍然有良定义的分配律 . 因此可以放心大胆地把二进制积引入行列式等问题中 .
这段话更严谨一些说 , 可以说集合幂级数形成了一个交换环 .
为了体现在这里引入二进制运算的意义 , 先来道例题 :
有一张左右各 \(n\) 点的二分图 , 有 \(m\) 条边 , 每条边有颜色 \(c\) , 颜色是 \([1,k]\) 中的整数 .
对于每个颜色集合 \(S\) , 询问是否存在完美匹配 , 使得颜色集合恰好为 \(S\) .
\(n\le 50,m\le n^2,k\le 10\) .
根据刚才的讨论 , 可以把每个边的权值设为 \(\begin{aligned}w\times y^{2^c}\end{aligned}\) , 其中 \(w\) 为随机权值 , \(y\) 为变量 , 通过按位或计算乘积 .
这样 , 行列式中 \(y^S\) 系数是否为 \(0\) 就说明了是否存在匹配 .
现在问题就是计算行列式 , 我们显然不能真的维护一个 \(2^k\) 次多项式 , 因为这样在高斯消元时没有逆元的定义 .
考虑我们在乘这个多项式时采取的是 FWT 的方法 , 因此我们推广这个方法 . 大致来讲 , 就是把 \(y\) 维度单独提出 , 然后在矩阵之间 FWT , 然后对每个矩阵求完行列式 , 再对行列式 IFWT . 根据 FWT 是线性变换 , 这样做是正确的 .
具体来说 , 构造 \(2^k\) 个矩阵 ,每个矩阵里只装含有 \(y^S\) 项 的系数 , 然后对这个矩阵序列做 FWT , 加减法就是对位加减 , 乘系数就是普通的数乘 .
然后对每个矩阵求出行列式 , 最后用 IFWT 还原行列式序列即可 .
也可以形式化地说明 . 这里利用了 FWT 和 IFWT 的线性性质 .
这里设矩阵 \(G\) 的元素是关于 \(y\) 的多项式 , 自动认为对一般多项式的 \(\prod\) 是卷积 , 对 \(FWT[A]\) 形式的 \(\prod\) 是对应值相乘 :
设矩阵 \(A_t\) 使其位置 \((i,j)\) 的值为矩阵 \(G\) 位置 \((i,j)\) 上 \(y^t\) 项的系数 , 有 \(FWT[A]_t(i,j)=(y^t)FWT[G(i,j)]\) :
这样就证明了任意可以用 FWT 运算的二进制运算 , 都可以用以上方法求出对应的集合幂级数矩阵行列式 .
这个方法可以用于 LGV 引理 , Matrix-Tree 定理等 , 如 P5406 [THUPC 2019] 找树 - 洛谷 .
不知不觉写了一大篇 , 感觉精华有一个随机化判定 , 有一个手推行列式联动 FWT . 确实有意思
回头看感觉 LGV 有点绕圈子了 , 不过也算是一个视角 .

浙公网安备 33010602011771号