第一篇学习笔记,之后可能会更更多这些中文资料比较匮乏,现存题目不多的算法相关的学习笔记。
FKT算法很久之前就听说过了,选择看了下网上的中文资料,然后发现仅有的一两篇博客还没有证明,于是丢掉了。最近做codechef月赛遇到了Tutte矩阵求解完美匹配相关的内容,于是学习了一波证明。于是决定自己写一篇博客,详细介绍一下这个很有意思的东西。
Warning:接下来的东西是博主自己自己理解的,不科学的地方欢迎指出,轻喷。
1.Pfaffian
令 P ( n ) P(n) P(n)为所有长度为 n n n排列的集合,再定义一个 n × n n\times n n×n( n n n为偶数)矩阵 A A A的 P f a f f i a n Pfaffian Pfaffian为 P f ( A ) = 1 2 n ⋅ n ! ⋅ ∑ p ∈ P ( n ) s g n ( p ) ∏ i A p 2 i − 1 , p 2 i Pf(A)=\frac{1}{2^n\cdot n!}\cdot \sum_{p\in P(n)} sgn(p) \prod_{i}A_{
{p_{2i-1}},{p_{2i}}} Pf(A)=2n⋅n!1⋅∑p∈P(n)sgn(p)∏iAp2i−1,p2i。
一般来说,我们只考虑 A A A是斜对称矩阵( A i , j = − A j , i A_{i,j}=-A_{j,i} Ai,j=−Aj,i)的情况,那么此时我们可以发现若固定了 ( M 2 i − 1 , M 2 i ) (M_{2i-1},M_{2i}) (M2i−1,M2i)的集合(显然可以得到 2 n ⋅ n ! 2^n\cdot n! 2n⋅n!个不同的排列),所有排列对 P f ( A ) Pf(A) Pf(A)的贡献是相同的。也即,令 P M ( n ) PM(n) PM(n)为所有 1 ∼ n 1\sim n 1∼n二元组划分的集合,例如 P M ( 4 ) = { { ( 1 , 2 ) , ( 3 , 4 ) } , { ( 1 , 3 ) , ( 2 , 4 ) } } PM(4)=\{ \{ (1,2 ), (3,4 ) \},\{ (1,3 ),(2,4 ) \} \} PM(4)={
{
(1,2),(3,4)},{
(1,3),(2,4)}},对于 P M ( n ) PM(n) PM(n)中的一个元素 M M M,我们定义 f ( M ) f(M) f(M)为按任意顺序排列 M M M中的 n / 2 n/2 n/2个数对并顺次连接起来(允许交换同一数对中两个数的顺序)所得到的排列 p p p的 s g n ( p ) ∏ i A p 2 i − 1 , p 2 i sgn(p)\prod_{i}A_{p_{2i-1},p_{2i}} sgn(p)∏iAp2i−1,p2i。那么有 p f ( A ) = ∑ M ∈ P M ( n ) f ( M ) pf(A)=\sum_{M\in PM(n)}f(M) pf(A)=∑M∈PM(n)f(M)。
一个重要的引理是,对于斜对称矩阵 A A A, P f ( A ) 2 = d e t ( A ) Pf(A)^2=det(A) Pf(A)2=det(A)。
证明考虑令 g ( π ) = s g n ( π ) ∏ i A i , π i g(\pi)=sgn(\pi) \prod_{i} A_{i,\pi_i} g(π)=sgn(π)∏iAi,πi,有 d e t ( A ) = ∑ π ∈ P ( n ) g ( π ) det(A)=\sum_{\pi \in P(n)}g(\pi) d