【算法专题】生成树计数(矩阵树定理)
【排列】
对于1~n的一个排列,定义对换:交换两个相邻元素的位置形成新的排列。
每次对换:要么消除一个逆序对,要么创造一个逆序对,可以证明当序列中不存在相邻逆序对时,序列升序排列。
所以对于给定排列,通过对换得到升序数列的次数奇偶性就是逆序对个数的奇偶性。
【行列式】
仅方阵有行列式。
$det(A)=\sum\limits_{σ}sign(σ)A_{1,σ1}A_{2,σ2}...A_{n,σn}=|A|$
其中σ表示1~n的一个排列,sign(σ)根据排列的奇偶性决定(奇-1偶+1),此式实际上是每行每列取一个数的所有情况,对每种情况计算乘积*奇偶性。
为了求解行列式,我们需要以下性质和推论:
1.两行互换,行列式变号。
两行互换一定对换了2*(j-i)-1次,所有排列的逆序对奇偶性改变。
2.两行相同,行列式为0。
两行相同时,对于一个x行选i和y行选j的排列,必然存在一个x行选j和y行选i的排列,数值相同奇偶性相反,故行列式为0。
3.对一行全部*k,行列式*k。
每个排列有且只有一个该行元素,所以答案*k。
4.两行成倍数,行列式为0。
对于一个两行相同的矩阵,由2得行列式为0。其中一行乘以倍数,由3得0*k=0,故行列式为0。
5.两个只有一行不同的矩阵,它们的行列式之和等于将这行加起来其余不变的矩阵的行列式。
考虑每个经过该行一个数字的排列,两个矩阵的该排列之和是两行加起来的矩阵的该排列之和。
6.一个矩阵的一行乘倍数后加到另一行上,行列式不变。
将矩阵由性质5拆成两个矩阵——一个原矩阵两行为i和j,一个为j*k和j,其中第二个矩阵由4得行列式为0,则行列式和原矩阵相同。
由上面的1和6就可以对矩阵进行高斯消元,最终得到右上的倒三角矩阵后主对角线的乘积就是行列式(只剩这一排列)。
定义余子式Mij表示除去i行j列后的剩余n-1阶矩阵的行列式。
其它无关的性质:|A|=|AT|,|AB|=|A||B|,行列式等于所有n-1阶余子式*对应值的和。
【矩阵树定理】Matrix-Tree
定义基尔霍夫矩阵为:n阶方阵(n为点数),对于a[i][j],deg[i]为i的入度,则有:
i=j,a[i][i]=deg[i]
i≠j且i-->j,a[i][j]=-1(若有重边,则为-重边条数)
a[i][j]=0
无向图的生成树数就是其基尔霍夫矩阵的任意n-1阶余子式。
有向图的树形图数是删除第x行和第x列的n-1阶余子式,其中x为选做为根的节点。
★例题:【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞