用 Tutte 矩阵求一般图最大权匹配

在本文中,我们会解决以下问题:

给定包含 \(N\) 个点和 \(M\) 条边的图,需要求出:

  • 最大权匹配;
  • 所有最大权匹配方案的边的并集。

\(1\le N\le 200\)\(1\le M\le \frac{N(N-1)}{2}\)

对于一个 \(N\times N\) 的矩阵 \(A\),其逆矩阵 \(A^{-1}\) 与伴随矩阵 \(\text{adj}(A)\) 满足以下关系:

Cramer 法则

\[ A^{-1} = \frac{\text{adj}(A)}{\det(A)} \]

也就是说:

\[(A^{-1})_{v,u} = \frac{(-1)^{u+v} M_{u,v}}{\det(A)} \]

其中 \(M_{u,v}\)\(A\) 去掉第 \(u\) 行和第 \(v\) 列得到的余子式。

对于一张图 \(G(V,E)\),我们定义它的 Tutte 矩阵 \(A(G)\) 满足:

\[A(G)_{i,j}=\begin{cases} x_{i,j}, & i<j,(v_i,v_j)\in E \\ -x_{i,j}, & i>j,(v_i,v_j)\in E \\ 0, & \text{otherwise} \end{cases} \]

其中 \(x_{i,j}\) 是一个变量。

以下简记 \(A(G)\)\(A\)

我们可以知道:

  • \(\det(A)\) 描述了图 \(G\) 中所有完美匹配的带符号和。
  • \(M_{u,v}\) 描述了图 \(G\) 去掉节点 \(u,v\) 后的所有完美匹配的带符号和。
  • \(A_{u,v}\)\(u\)\(v\) 之间的权重和系数。

同时,我们不加证明的给出:

Tutte 定理

\(G\) 存在完美匹配当且仅当 \(\det(A)\ne0\)

接下来,让我们考察:

\[(A^{-1})_{v,u}\cdot A_{u,v}=\frac{\pm M_{u,v} \cdot A_{u,v}}{\det(A)} \]

其中,\(M_{u,v} \cdot A_{u,v}\) 表示“强制选中 \((u,v)\),剩余边构成的完美匹配”的方案总和。

如果这个值不是零,就说明存在一个完美匹配的方案包含 \((u,v)\) 这条边。

考虑如何找到边权和最大的完美匹配。

对于矩阵中的每一个变量 \(x_{i,j}\),我们将其替换为 \(y^{w_{i,j}}\)\(y\) 同样是一个对应的变量,\(w_{i,j}\) 是边权。

现在,矩阵 \(A(y)\) 的行列式变为了关于 \(y\) 的多项式。

\(\det{A(y)}\) 这个多项式中,其最高项指数是最大权完美匹配权重的 \(2\) 倍。

我们定义 \(A_{i,j}=r_{i,j}\cdot y^{w_{i,j}}\)

同时,我们定义一种关于 \((d,v)\) 的运算来模拟多项式,并且只保留最高次项。其中 \(d\) 是指数,\(v\)\(r_{i,j}\) 经过若干运算得到的。

这个运算的乘法和加法定义如下:

\[(d_1,v_1)\times (d_2,v_2)=(d_1+d_2,v_1\cdot v_2) \\ \]

\[(d_1,v_1)+(d_2,v_2)=\begin{cases} (d_1,v_1) & d_1>d_2\\ (d_2,v_2) & d_1<d_2\\ (d_1,v_1+v_2) & (d_1=d_2) \end{cases} \]

求出 \(\det(A)\) 的最高次项 \((D,V)\)\(\frac{D}{2}\) 就是最大权完美匹配的权重。

如果一条边 \(e=(u,v)\)(权重为 \(w\))在某个最大权完美匹配中,当且仅当

\[\text{Weight}(G \setminus {u,v}) + w = \text{Weight}(G) \]

由 Cramer 法则,我们知道 \(A\) 的逆矩阵元素 \((A^{-1})_{v,u}\) 的次数就是:

\[\text{deg}((A^{-1})_{v,u})=\text{deg}(M_{u,v}) - \text{deg}(\det(A)) \]

也就是说,在逆矩阵中,其储存了“除去边 \((u,v)\) 的图权重”相对于“原图权重”的差值。

对于一条权重为 \(w\),随机系数为 \(r\) 的边 \((u,v)\)。令 \(\text{chk}_{u,v}=(A^{-1})_{u,v}\times (w,r)\)

如果 \(\text{deg}(\text{chk}_{u,v})=0\)\(\text{val}(\text{chk}_{u,v})\ne 0\) 则说明边 \((u,v)\) 在某个最大权完美匹配中。

以上算法的时间复杂度为 \(O(n^3)\),瓶颈在于求出逆矩阵。

但是原问题是求出最大权匹配而非最大权完美匹配。

所以,我们需要允许一个点不被匹配。具体的,对于每个点 \(i\),我们建立虚点 \(i^\prime\),我们建立两种权重为 \(0\) 的边 \((i,i^\prime)\)\((i^\prime,j^\prime)\)\(i^\prime\ne j^\prime\))。

这样就可以将最大权完美匹配转化为最大权匹配。

posted @ 2026-02-01 01:20  ddxrS  阅读(3)  评论(0)    收藏  举报