文章目录
结论
实际上求得的是每个生成树边权乘积的总和
无向图
对于无向图
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。
口胡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=⎩⎪⎪⎪⎨⎪⎪⎪⎧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
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=⎩⎪⎪⎪⎨⎪⎪⎪⎧a110⋮0a12a22⋮0⋯⋯⋱⋯a1na2n⋮ann⎭⎪⎪⎪⎬⎪⎪⎪⎫
即左下角都是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}
∣∣∣∣∣∣∣∣∣∣∣∣a11⋮ai1+bi1⋮an1a12⋮ai2+bi2⋮an2⋯⋯⋯a1n⋮ain+bin⋮ann∣∣∣∣∣∣∣∣∣∣∣∣=∣∣∣∣∣∣∣∣∣∣∣∣a11⋮ai1⋮an1a12⋮ai2⋮an2⋯⋯⋯a1n⋮ain⋮ann∣∣∣∣∣∣∣∣∣∣∣∣+∣∣∣∣∣∣∣∣∣∣∣∣a11⋮bi1⋮an1a12⋮bi2⋮an2⋯⋯⋯a1n⋮bin⋮ann∣∣∣∣∣∣∣∣∣∣∣∣
这几个性质可以用下面这个公式(拉普拉斯展开)证明。
拉普拉斯展开
对方阵
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即可。
柯西-比尼定理(Cauchy-Binet)
对于一个
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中的行组成的方阵。
证明略 (不会证)
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=⎩⎪⎪⎪⎨⎪⎪⎪⎧LG10⋮00LG2⋮0⋯⋯⋱⋯00⋮LGk⎭⎪⎪⎪⎬⎪⎪⎪⎫
如果图不连通,则存在多余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
<
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就相当于枚举所有边的树,并记下了方案数。