生成树系列Matrix-Tree,Best定理算法流程

生成树系列Matrix-Tree,Best定理算法流程

前置知识:矩阵行列式\(|A|\) (行数和列数相等)

基础求法:枚举一个排列\(p_i\),设排列\(p\)的逆序对为\(f(p)\)\(|A|=\sum (-1)^{f(p)} \Pi A_{i,p_i}\)

性质:

1.交换任意两行(列),\(|A'|=-|A|\),(交换后每个排列\(f(p)\)的奇偶性改变)

2.对于某一行(列)乘上一个值\(k\)\(|A'|=k|A|\)

3.某一行减去另一行的\(k\)倍,\(|A'|=|A|\)

4.对于一个对角矩阵(左下角是空的),\(|A|=\Pi A_{i,i}\)

根据性质1,2,3可以对于矩阵进行高斯消元,得到对角矩阵之后就可以快速求解,\(O(n^3)\)

由于统计过程中可能出现double运算,可以通过辗转相乘或者大质数取模来避免

Matrix-Tree定理

对于一个无向图,构造矩阵\(A\)满足

\[A_{i,j}=\left\{ \begin{aligned} deg_i, && i=j \\ -1 && i和j联通 \\ 0 \end{aligned} \right. \]

同时去掉任意\(i\)行和\(i\)列, 答案就是\(|A'|\),还可以推广到有重边的图\(G\)是邻接矩阵

\[A_{i,j}=\left\{ \begin{aligned} deg_i, && i=j \\ -G_{i,j} && i\ne j\end{aligned} \right. \]

如果是有向图,点\(S\)为根,则构造类似的矩阵之后去掉第\(S\)行和第\(S\)列即可

Best定理:欧拉回路计数

从起点\(S\)出发不重复地遍历所有的有向边

统计每个点的入度和出度\(indeg_i,outdeg_i\),必然有\(indeg_i=outdeg_i\)

答案就是生成树方案\(\cdot \Pi(indeg_i-1)!\)

如果是求遍历序列个数,还要考虑\(S\)不同断点的重复,还要再乘上\(indeg_S\)

如果认为每条边是一样的,则还要除去\({\Pi G_{i,j}!}\)

猜你喜欢

转载自www.cnblogs.com/chasedeath/p/12716002.html