生成树系列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}!}\)