行列式默认大家都会。不会的可以买本线性代数看看,反正早晚都要学。对吗
首先介绍 Prufer序列(可跳过,和矩阵树定理没有什么关联)
Prufer序列 身份证:
形态:一个序列
对象:一棵树
作用:用一个序列去唯一表示一棵树。
具体是怎么做到的呢?我们来采访一下 Prufer先生
Prufer:见笑,见笑。其实我也没干什么。只是在无根树的情况,依次把度数为1,编号最小节点取了出来,并把它唯一连接的那个点的编号加到了序列里。在有根树的情况下。依次把编号最小的叶子结点取了出来,并把它的父亲放在了序列里。
我们可以发现,对于有根树的Prufer序列,最后一个数字一定是根节点的编号。
对于任意一个Prufer序列,我们也有简单的
nlogn 的模拟算法(有
O(n) 算法,此处略去不表)将其还原成树。我们首先维护一个备选"堆",把Prufer序列里没出现的数字放到堆里面,一边扫Prufer序列,一边把堆里最小的挑出来,认Prufer序列扫到的那个数为爹。如果Prufer序列的这个数是它最后在序列里出现的话,那么把它也放在堆里面,这样就做完了。
这样我们就引出一个结论:
n 个节点能构成
nn−2 个有根树,
nn−1 个无根树。
矩阵树,它求的其实是
T为G(V,E)的生成树∑E∈T∏w(E)
看到和和乘,要注意其组合意义。看到
w(E),要想到可以给它赋各种各样的权值来满足我们的目的。
可以先令
w(E)=1,这样就把问题变成了生成树计数。然后再扩展到
w(E)∈N 的情况,对于
w(E)=C,可以看作是
(u,v) 间连了
C 条边,你暗自想着。
就在这时,你的数学老师进来了,分发着一张试卷:同学们,我们开一个小灶!
试卷上的第一题写着:矩阵
A 是一个
n∗m 的矩阵,
B 是一个
m∗n 的矩阵,证明
det(AB)=S为1⋯m选n个数∑det(A里所有S列)det(B里所有S行)
你突然想到,当初证明
det(A)det(B)=det(AB) (其中
A,B 都是方程),是使用了
[A−EOB]作变换。
作为一个线性代数会举一反三的同学,你构造出了如下方阵。
[A−EmOB]
由于已经有了方阵行列式的性质,所以你和当初证明
det(A)det(B)=det(AB) 有了不同,直接用矩阵乘法代表你的矩阵变换。
[EnOmnAEm][A−EmOB]=[O−EmABB]
因此我们有
A−EmOB=O−EmABB
LHS: 上
n 行和右
n 列都要选,剩下的
m−n 是在
Em 里选,也就是说对于
Em 一共最多只能有
n 个
−1 被消掉了。也就是说
A 和
B 选取的是同样的行,同样的列!
RHS:直观感觉等于
±det(AB)
不要纠结正负了,其实关系不大。最后正负是对的。
这是
Binet−Cauchy 定理。
小灶结束,你继续在OI的海洋里自在探索。
首先我们讨论无向图的情况。
det(AB)=S为1⋯m选n个数∑det(A里所有S列)det(B里所有S行)
构造
An∗m ,对于第
i 条无向边
(u,v),令
Au,i=1,Av,i=−1 (这里顺序不要紧),然后对于
Bn∗m,令
Bi,u=1,Bi,v=−1
C=∑w(1,∗)−w(2,1)−w(3,1)⋮−w(n,1)−w(1,2)∑w(2,∗)−w(3,2)⋮−w(n,2)−w(1,3)−w(2,3)∑w(3,∗)⋮−w(n,3)⋯⋯⋯⋮⋯−w(1,n)−w(2,n)−w(3,n)⋮∑w(n,∗)
最后,我们删除
C 中一行一列(必须行号
=1 列号,这里假设删掉第一行),它的行列式就是最终的答案。
较为容易发现,这时的
C 相当于把
A 中的第
rt 行,
B 中的第
rt 列去除,然后再乘起来的结果。
至于证明,我们先讨论
w(E)=1 的情况,从
A 和
B 入手。分为两个方面,一方面是生成树能够对答案产生
+1 的贡献,一方面是如果这里面有环贡献一定是
0。
两方面都蛮好证的,第一方面,我们搞出了一棵树,然后给这棵树建立
dfs 序,如果节点
i 的
dfs 序是
x,代表它和它的父亲对应的那条边,在
A 上将会被转到第
x 行。这样很容易看出来是一个上三角/下三角矩阵,
det 只能是
±1
又
B=AT,所以
det(B′)=det(A′),最后出来就是
1
如果有环,此时注意一号节点需要特判。结果表明,无论有没有一号节点,只要有环。这个方阵的
n 个列向量就一定线性相关,从而行列式就是
0
这样子,我们再推到
w(E)∈N 的情况,把
E(u,v) 拆成
W(E) 条边,对应在两个矩阵上乱搞,最后出来的方阵
C 仍然和
w(E)=1 的形态一致!
恭喜你!无向图的情况被你解决了,现在我们来解决有向图的情况。
有向图,有根树,且要确定方向!
这里以外向图为例子!(外向,指从 root 开始就外向,从父亲指向儿子!)
这里,我们对
A 和
B 动一些手脚,
A 负责没有环,
B 负责外向。
我们发现,没有环且联通的情况下,外向当且仅当每个节点只被指向一次(除了根节点!)
所以我们要让存在节点被指向多次的选取方案,其行列式为
0 (线性相关),每个节点(除rt)被指向一次的选取方案,其行列式为
±1,并和
A 中对应选取方案的行列式保持一致
这样看来就很明显了,对于第
i 条边
u ->
v,我们只记
Bi,y=1,然后
A 中不得胡闹!必须得是
Ax,i=−wi,Ay,i=wi,以此和
B 的行列式保持一致(具体是为什么我没去想)
C=j∑wj→1−w2→1−w3→1⋮−wn→1−w1→2j∑wj→2−w3→2⋮−wn→2−w1→3−w2→3j∑wj→3⋮−wn→3⋯⋯⋯⋮⋯−w1→n−w2→n−w3→n⋮j∑wj→n
注意最后要把第rt行第rt列给去掉!原因在B矩阵中已经很明显了。