矩阵树定理

证明
Binet-Cauchy定理
矩阵树定理的实质,就是2个矩阵:
1 . 拉普拉斯矩阵 L
简单来说就是度减邻:(度数矩阵减去邻接矩阵)
2 . 关联矩阵 B
简单来说就是像一个表格:

第j条边
第i个点 i是j的第一个端点?1:i是j的第二个端点?-1:0

这个表格是 n ∗ m n*m nm的。
把他看做一个矩阵。
那么 BBT 如果你能仔细对照定义算算会发现他等于L。
3 .B与生成树个数有密切的关系:
如果我们使用暴力算法,每次选出n-1个边,检查是否形成生成树,直到所有边的组合都被遍历完。
如何检查是否形成生成树?
因为只有n-1个边,如果不形成生成树,就会不连通,所以我们只需要快速判断联通。

4.将暴力算法用矩阵表达:
选出B中的n-1列作一个新矩阵P,那么这n-1列就相当于枚举的n-1条边,PPT就是这n-1条边的拉普拉斯矩阵,如果再把P的第一行删去,那么PPT就是拉普拉斯矩阵的代数余子式。

5.最难的一点:Binet-Cauchy定理
具体就是:
对于两个正方形矩阵A,B, d e t ( C = A B ) = d e t ( A ) ∗ d e t ( B ) det(C = AB) = det(A) * det(B) det(C=AB)=det(A)det(B)
对于非正方形矩阵A,B也可以推广。
最有普适性的证明方法:

构造矩阵
在这里插入图片描述
百度百科证明 d e t ( M ) = d e t ( N ) det(M) = det(N) det(M)=det(N)的过程十分简洁易懂。
但是在探讨 d e t ( M ) , d e t ( N ) det(M),det(N) det(M),det(N)与A,B的关系时十分线代。
现在用简单的语言阐述一下。
设A为 n ∗ m n*m nm的矩阵 , B为 m ∗ n m*n mn的矩阵。
1: n = m n=m n=m
因为右上角是全0,所以按最简单的在这里插入图片描述
的计算方法,选的 a i j a_{ij} aij都是A或B中的元素,如果选了 I I I中的元素,那么就一定会选 0 0 0中的元素从而贡献为0,不用考虑。
所以选出的排列(看定义)一定是在A中选n个再在B中选n个,逆序对增加了 n 2 n^2 n2个,也就是 d e t ( M ) = d e t ( A ) ∗ d e t ( B ) ∗ ( − 1 ) n 2 det(M) = det(A) * det(B) * (-1)^{n^2} det(M)=det(A)det(B)(1)n2
又因为 d e t ( N ) = d e t ( C ) ∗ d e t ( − I ) = d e t ( C ) ∗ ( − 1 ) n det(N) = det(C) * det(-I) = det(C) * (-1)^n det(N)=det(C)det(I)=det(C)(1)n
所以 d e t ( A ) ∗ d e t ( B ) = d e t ( A B ) det(A) * det(B) = det(AB) det(A)det(B)=det(AB)
2: n > m n>m n>m
一定会选到0.答案为0.
3: n < m n<m n<m
显然还有 d e t ( N ) = d e t ( C ) ∗ d e t ( − I ) = d e t ( C ) ∗ ( − 1 ) m det(N) = det(C) * det(-I) = det(C) * (-1)^m det(N)=det(C)det(I)=det(C)(1)m
还是按那个计算方法理性分析一波 d e t ( M ) det(M) det(M)
一定选的是n个A中元素和n个B中元素+m-n个-1。
接下来需要紧盯图片充分理解:
矩阵树定理_第1张图片

那么我们枚举这A中的n列和B中的n行。
因为 − I -I I只在对角线是-1,别的都是0,所以我们选的列编号恰好一一对应等于行编号。
所以我们设 S = 1 , 2 , . . . m 中 大 小 为 n 的 子 集 S = 1,2,...m中大小为n的子集 S=12...mn
那么实际上我们是选出了两个正方形矩阵 A n , S , B S , n A_{n,S},B_{S,n} An,S,BS,n, S S S表示选出了那几行。
那么可以理解所有A中元素都在 A n , S A_{n,S} An,S中且B中元素都在 B S , n B_{S,n} BS,n中的排列的贡献的总和 = d e t ( A ) ∗ d e t ( B ∗ ( − 1 ) m − n + ( − I 与 A , B , 产 生 的 逆 序 对 个 数 ) + ( A 与 B 的 逆 序 对 个 数 ) =det(A)* det(B * (-1)^{m-n+ (-I与A,B,产生的逆序对个数) + (A与B的逆序对个数)} =det(A)det(B(1)mn+(IA,B,)+(AB)
然后可以发现,如果 − I -I I中一个元素 ( i , i ) (i,i) (i,i)与A产生了k对逆序对,那么也会和B产生k对逆序对,那么产生的逆序对总是偶数个,就可以不用管了。
所以 d e t ( M ) = ∑ S = n   i n   m d e t ( A n , S ) d e t ( B S , n ) ∗ ( − 1 ) m − n + n 2 = d e t ( C ) ∗ ( − 1 ) m det(M) = \sum_{S = n \ in \ m} det(A_{n,S})det(B_{S,n})*(-1)^{m-n+n^2} = det(C) * (-1)^m det(M)=S=n in mdet(An,S)det(BS,n)(1)mn+n2=det(C)(1)m
所以 d e t ( A B ) = ∑ S = n   i n   m d e t ( A n , S ) d e t ( B S , n ) det(AB) = \sum_{S = n \ in \ m} det(A_{n,S})det(B_{S,n}) det(AB)=S=n in mdet(An,S)det(BS,n)
然后发现线性代数的定理只要用人类智慧去理解,不去看那些严谨的证明还是比较显然的。。。。。。
其实就是一个规律嘛。

6.因为 B B T = L BB^T = L BBT=L,所以枚举B中n-1条边的操作我们可以通过反用Binet-Cauchy定理来巧妙的避开:
C i , j = ∑ S ∈ ( [ m ] n − 1 ) det ⁡ ( F [ n − 1 ] , S ) det ⁡ ( F S , [ n − 1 ] T ) = ∑ S ∈ ( [ m ] n − 1 ) det ⁡ ( F [ n − 1 ] , S ) 2 C_{i,j}=\sum_{S\in{[m]\choose n-1}}\det\left(F_{[n-1],S}\right)\det\left(F^\mathrm T_{S,[n-1]}\right)=\sum_{S\in{[m]\choose n-1}}\det\left(F_{[n-1],S}\right)^2 Ci,j=S(n1[m])det(F[n1],S)det(FS,[n1]T)=S(n1[m])det(F[n1],S)2
= ∑ S ∈ ( [ m ] n − 1 ) det ⁡ ( F [ n − 1 ] , S F S , [ n − 1 ] T ) =\sum_{S\in{[m]\choose n-1}}\det\left(F_{[n-1],S} F^\mathrm T_{S,[n-1]}\right) =S(n1[m])det(F[n1],SFS,[n1]T)
C是L的代数余子式,F是B去掉一行后的矩阵。
所以最后一个大东西的det非负,接下来我们发现最后两个矩阵的乘积就是选出n-1条边后的拉普拉斯矩阵的代数余子式。
当图不连通时,可以通过行列变换使得同一个联通块在一堆,除了第一个联通块因为少了一个点行列式不为0,别的联通块的行列式都为0(具体看大佬博客),所以总行列式为0.
当图联通时,考虑倒数第二个 ∑ \sum ,可以通过从删去的那一个行(代表的点)dfs,把每个点变成二元组 ( d f s e ( i ) , i ) (dfse(i),i) dfse(i),i,其中 d f s e ( i ) dfse(i) dfse(i)为i到父亲的边的编号,把矩阵行变换,使得第一行为dfs序最靠前的点(代表的行),第二行为dfs序第二。在列变换一下,使得先dfs到的边编号更小,那么从小到大dfs加列,加一条边就会加一个点,也就是同时加一行一列同时这个点不会往比这条边编号小的边有连边,所以这第i行的第i列之前都是0,这样我们就通过变换得到了一个上三角矩阵,它的行列式为主对角线的元素乘积,主对角线上的值都为正负1,所以它的平方为1。
所以L的余子式就刚好是生成树个数。
另外mod 意义下的行列式是可以 O ( n 3 ) O(n^3) O(n3)求的。

仔细想来,真正实现非多项式算法到多项式算法的,是Binet-cauchy定理,是线性代数,是这万物中隐含的律动。

言归正传。

有向图的树形图个数
无向变成有向只是B矩阵会变,可以证明不连通依然为0,联通依然为1.
内向变成外向只是把所有边取反而已。

如果有重边。
那么联通时行列式的值会乘上重复的次数。
也就是说,如果在邻接矩阵 A [ i ] [ j ] A[i][j] A[i][j]中不止有01,可以有其他的值的话。
矩阵树定理算出来的是所有生成树中,每颗树的边权之积,的和。
同理也可以把边权设为小数什么的,只是炸double。。。。。

看起来更为有用的推广:
[JZOJ5153]树形图求和
另一种解法
第一种解法是定义新的二元数并证明这是一个欧几里得环。。。。。。
第二种解法是根据逆矩阵与伴随矩阵与余子式与行列式的关系,算出伴随矩阵之后可以支持每次!独立!修改同一行的值后 O ( n ) O(n) O(n)甚至 O ( 1 ) O(1) O(1)对一行展开求行列式。

你可能感兴趣的:(计数,性质分析,矩阵优化,模板)