生成树计数——矩阵树定理(Matrix-Tree)

结论

实际上求得的是每个生成树边权乘积的总和

无向图

对于无向图 G G G,设第 i i i个点的度数为 d i d_i di,第 i i i个点与第 j j j个点相连的边数为 a i j a_{ij} aij
定义 G G G的基尔霍夫矩阵 L G L_G LG 为:当 i ≠ j i\neq j i̸=j时, l i j = − a i j l_{ij}=-a_{ij} lij=aij;当 i = j i=j i=j l i i = d i l_{ii}=d_i lii=di
定义 M i j M_{ij} Mij为矩阵 L G L_G LG删除第 i i i行和第 j j j列后的矩阵(即 L G L_G LG l i j l_{ij} lij余子式)。
i = j i=j i=j时,称 M i i M_{ii} Mii L G L_G LG的主余子式。

则图 G G G的生成树个数为任意一格主余子式 M i i M_{ii} Mii的行列式的绝对值。

有向图

对于有向图 G G G,设第 i i i个点的除去自环后的入度为 d i d_i di,第 i i i个点与第 j j j个点相连的边数为 a i j a_{ij} aij

定义 G G G的基尔霍夫矩阵 L G L_G LG 为:当 i ≠ j i\neq j i̸=j时, l i j = − a i j l_{ij}=-a_{ij} lij=aij;当 i = j i=j i=j l i i = d i l_{ii}=d_i lii=di
定义 M i j M_{ij} Mij为矩阵 L G L_G LG删除第 i i i行和第 j j j列后的矩阵(即 L G L_G LG l i j l_{ij} lij余子式)。
i = j i=j i=j时,称 M i i M_{ii} Mii L G L_G LG的主余子式。

则图 G G G的以点 i i i为根的生成树个数为主余子式 M i i M_{ii} Mii的行列式的绝对值。

带权图

设第 i i i个点与第 j j j个点相连的边权为 a i j a_{ij} aij
定义 G G G的基尔霍夫矩阵 L G L_G LG 为:当 i ≠ j i\neq j i̸=j时, l i j = − a i j l_{ij}=-a_{ij} lij=aij;当 i = j i=j i=j l i i = ∑ k = 1 , k ≠ i n a i k l_{ii}=\sum\limits_{k=1,k\neq i}^n a_{ik} lii=k=1,k̸=inaik

口胡Matrix-Tree证明

前置技能

行列式

定义

对于 n n n阶方阵 A A A
A = { a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n } A = \left\{\begin{matrix}a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn}\end{matrix}\right\} A=a11a21an1a12a22an2a1na2nann
它的行列式 D D D
D = ∣ A ∣ = ∑ S ( − 1 ) k a 1 , S 1 ⋅ a 2 , S 2 ⋅ a 3 , S 3 . . . a n , S n D=|A|=\sum_S(-1)^ka_{1,S_1}\cdot a_{2,S_2}\cdot a_{3,S_3}...a_{n,S_n} D=A=S(1)ka1,S1a2,S2a3,S3...an,Sn
s s s为1~n的排列, k k k为此排列的逆序对数。
所以

初等变换
  • 这种矩阵: A = { a 11 a 12 ⋯ a 1 n 0 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ a n n } A = \left\{\begin{matrix}a_{11} & a_{12} & \cdots & a_{1n} \\ 0 & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & a_{nn}\end{matrix}\right\} A=a1100a12a220a1na2nann
    即左下角都是0, ∣ A ∣ = ∏ i = 1 n a i i |A|=\prod_{i=1}^n a_{ii} A=i=1naii
    (相当于只用 S = 1 , 2 , 3 , 4 , . . . , n S=1,2,3,4,...,n S=1,2,3,4,...,n才有值,其它S都会扯到左下方的0)
  • 将矩阵的两行或两列交换,行列式的值 × ( − 1 ) \times (-1) ×(1)。(可以理解为:对于每个 S S S,逆序对数都变化了1)
  • 将矩阵的一行或一列全部乘以常数 p p p,行列式的 × p \times p ×p
  • 将矩阵的一行或一列全部乘以常数 p p p,再加到另一行(列)上去,行列式的值不变。
  • ∣ a 11 a 12 ⋯ a 1 n ⋮ ⋮ ⋮ a i 1 + b i 1 a i 2 + b i 2 ⋯ a i n + b i n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ = ∣ a 11 a 12 ⋯ a 1 n ⋮ ⋮ ⋮ a i 1 a i 2 ⋯ a i n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ + ∣ a 11 a 12 ⋯ a 1 n ⋮ ⋮ ⋮ b i 1 b i 2 ⋯ b i n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots & & \vdots \\ a_{i1}+b_{i1} & a_{i2}+b_{i2} & \cdots & a_{in}+b_{in} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} = \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots & & \vdots \\ a_{i1} & a_{i2} & \cdots & a_{in} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} + \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ \vdots & \vdots & & \vdots \\ b_{i1} & b_{i2} & \cdots & b_{in} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} a11ai1+bi1an1a12ai2+bi2an2a1nain+binann=a11ai1an1a12ai2an2a1nainann+a11bi1an1a12bi2an2a1nbinann
    这几个性质可以用下面这个公式(拉普拉斯展开)证明。
拉普拉斯展开

对方阵 A A A的第 i i i行进行展开:
D = ∑ j = 1 n ( − 1 ) i + j a i j M i j D=\sum_{j=1}^n (-1)^{i+j}a_{ij}M_{ij} D=j=1n(1)i+jaijMij
可以理解为将 a i j a_{ij} aij经过 i + j i+j i+j次交换移动到第一行第一列去,再计算。

行列式求法

用类似(几乎一模一样)高斯消元的方法,将矩阵用前面那一坨性质消成上三角型,然后把对角线乘起来,记录一下交换行的次数,判断要不要乘-1即可。

柯西-比尼定理(Cauchy-Binet)

对于一个 n × m n\times m n×m ( n ≤ m n\leq m nm)的矩阵 A A A,和 m × n m\times n m×n的矩阵 B B B
∣ A B ∣ = ∑ ∣ s ∣ = n ∣ A ∗ s B s ∗ ∣ |AB| = \sum_{|s|=n} |A_{*s}B_{s*}| AB=s=nAsBs
s s s 1 , 2 , 3 , . . . , m 1,2,3,...,m 1,2,3,...,m的大小为n的子集, A ∗ s A_{*s} As选s集合中的列组成的方阵, B s ∗ B_{s*} Bs表示只选s中的行组成的方阵。

证明略 (不会证)

Matrix-Tree定理证明

基尔霍夫矩阵性质

基尔霍夫矩阵行列式为0

可以发现,基尔霍夫矩阵中,每一列的和一定为0
用行列式的性质,可以把所有行都加到其中一行上,这一行就全部为0,则行列式就为0了。
所以基尔霍夫矩阵的行列式为0。

不连通的图的主余子式行列式为0

对于不连通的图,其基尔霍夫矩阵,可以通过若干次交换行或列,得到以下形式:
(0表示一个全0的矩阵, L G i L_{G_i} LGi为第i个连通块的基尔霍夫矩阵)
L G = { L G 1 0 ⋯ 0 0 L G 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ L G k } L_G = \left\{\begin{matrix} L_{G_1} & 0 & \cdots & 0 \\ 0 & L_{G_2} & \cdots & 0\\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & L_{G_k} \end{matrix}\right\} LG=LG1000LG2000LGk
如果图不连通,则存在多余1个的 L G i L_{G_i} LGi,不论主余子式删除的是哪一行那一列,都存在一个连通块的 L G i L_{G_i} LGi保证完整,通过变换,可以使某一行变为全0,则这个主余子式的行列式为0。

树的主余子式为1

将树的结点按深度从小到大重新标号,并且使主余子式删掉的编号 i i i为当前的根。
按深度从小到大重新标号
设一个编号为 u u u的叶子结点,它的父亲结点编号为 v v v。则主余子式上第 u u u行一定为这个样子: l u v = − 1   ( v &lt; u , v ≠ 1 ) ,   l u u = 1 l_{uv}=-1\ (v&lt;u,v\neq 1),\ l_{uu}=1 luv=1 (v<u,v̸=1), luu=1,其余全为0。
则从主余子式的最后一行开始(此时这一行一定为叶子),将这个叶子结点的父亲那一行,减去当前这一行,然后删掉这个叶子结点。
当一个结点 u u u的儿子被删完后,这个结点就变成新的叶子结点,且在主余子式上也变为这种形式: l u v = − 1   ( v &lt; u , v ≠ 1 ) ,   l u u = 1 l_{uv}=-1\ (v&lt;u,v\neq 1),\ l_{uu}=1 luv=1 (v<u,v̸=1), luu=1,其余全为0。
直到只剩下1的儿子结点。
通过这样的转化,使得主余子式变为下三角形,且对角线上全部为1。
所以它的行列式也为1。

关联矩阵

定义图 G G G的关联矩阵 B B B为:对于一条编号为 i i i的边 ( u i , v i ) (u_i,v_i) (ui,vi),则 B i , u i = 1 ,   B i , v i = − 1 B_{i,u_i}=1,\ B_{i,v_i}=-1 Bi,ui=1, Bi,vi=1
关联矩阵是 m × n m\times n m×n的, n n n为点数, m m m为边数。
定义 B B B转置矩阵 B T B^T BT
可以得出 B B T = L G BB^T=L_G BBT=LG,直接把矩阵乘法的式子写出来可以轻松证明。

证明主体

定义 B i B_i Bi表示关联矩阵删去第 i i i列的矩阵。
∣ M i i ∣ = ∣ B i T B i ∣ |M_{ii}|=|B_i^TB_i| Mii=BiTBi
由柯西-比尼定理得
M i i = ∣ B i T B i ∣ = ∑ ∣ s ∣ = n − 1 ∣ ( B i T ) s ∗ ( B i ) ∗ s ∣ M_{ii} = |B_i^TB_i| = \sum_{|s|=n-1} |(B_i^T)_{s*}(B_i)_{*s}| Mii=BiTBi=s=n1(BiT)s(Bi)s
观察发现 s s s,即为选择的边的集合
如果选的边的集合导致图不连通,由之前的证明得到,它的行列式为0。
如果选的边连通,则构成一颗树,它的行列式为1。

于是 M i i M_{ii} Mii就相当于枚举所有边的树,并记下了方案数。

证毕

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值