实际上求得的是每个生成树边权乘积的总和
对于无向图 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̸=i∑naik。
对于 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=⎩⎪⎪⎪⎨⎪⎪⎪⎧a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1na2n⋮ann⎭⎪⎪⎪⎬⎪⎪⎪⎫
它的行列式 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,S1⋅a2,S2⋅a3,S3...an,Sn
s s s为1~n的排列, k k k为此排列的逆序对数。
所以
对方阵 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=1∑n(−1)i+jaijMij
可以理解为将 a i j a_{ij} aij经过 i + j i+j i+j次交换移动到第一行第一列去,再计算。
用类似(几乎一模一样)高斯消元的方法,将矩阵用前面那一坨性质消成上三角型,然后把对角线乘起来,记录一下交换行的次数,判断要不要乘-1即可。
对于一个 n × m n\times m n×m ( n ≤ m n\leq m n≤m)的矩阵 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∣=n∑∣A∗sBs∗∣
s s s为 1 , 2 , 3 , . . . , m 1,2,3,...,m 1,2,3,...,m的大小为n的子集, A ∗ s A_{*s} A∗s选s集合中的列组成的方阵, B s ∗ B_{s*} Bs∗表示只选s中的行组成的方阵。
证明略 (不会证)
可以发现,基尔霍夫矩阵中,每一列的和一定为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=⎩⎪⎪⎪⎨⎪⎪⎪⎧LG10⋮00LG2⋮0⋯⋯⋱⋯00⋮LGk⎭⎪⎪⎪⎬⎪⎪⎪⎫
如果图不连通,则存在多余1个的 L G i L_{G_i} LGi,不论主余子式删除的是哪一行那一列,都存在一个连通块的 L G i L_{G_i} LGi保证完整,通过变换,可以使某一行变为全0,则这个主余子式的行列式为0。
将树的结点按深度从小到大重新标号,并且使主余子式删掉的编号 i i i为当前的根。
设一个编号为 u u u的叶子结点,它的父亲结点编号为 v v v。则主余子式上第 u u u行一定为这个样子: l u v = − 1 ( v < u , v ≠ 1 ) , l u u = 1 l_{uv}=-1\ (v<u,v\neq 1),\ l_{uu}=1 luv=−1 (v<u,v̸=1), luu=1,其余全为0。
则从主余子式的最后一行开始(此时这一行一定为叶子),将这个叶子结点的父亲那一行,减去当前这一行,然后删掉这个叶子结点。
当一个结点 u u u的儿子被删完后,这个结点就变成新的叶子结点,且在主余子式上也变为这种形式: l u v = − 1 ( v < u , v ≠ 1 ) , l u u = 1 l_{uv}=-1\ (v<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∣=n−1∑∣(BiT)s∗(Bi)∗s∣
观察发现 s s s,即为选择的边的集合
如果选的边的集合导致图不连通,由之前的证明得到,它的行列式为0。
如果选的边连通,则构成一颗树,它的行列式为1。
于是 M i i M_{ii} Mii就相当于枚举所有边的树,并记下了方案数。