【算法专题】生成树计数(矩阵树定理)

【排列】

对于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 月赛」白金元首与独舞

 

posted @ 2017-12-29 06:57  ONION_CYC  阅读(782)  评论(0编辑  收藏  举报