矩阵树定理
撅震树腚里
P6178。板子题。有有向树有无向树。
计算一个图的生成树个数。
设图的邻接矩阵是 \(G\)(\(G_{i,j}\) 就是 \(i,j\) 之间边的条数),度数矩阵 \(D\) (除了 \((i,i)\) 位置是度数其他均为0),设 \(M=D-G\),则有该图的生成树数量即为 \(M\) 去掉第 \(i\) 行 \(i\) 列(\(i\) 任意)形成的行列式的值。
这个也可以理解成一个边带权的图的所有生成树边权乘积之和。
行列式求值就是高斯消元消成上三角矩阵。消元过程中,交换两行答案取相反数,一行整体减去另一行倍数不变,某行整体乘 \(x\),答案也乘 \(x\)。最后的答案就是消元过程中的系数乘上主对角线的乘积。
例:LgP4336。容斥+矩阵树定理。设 \(f(S)\) 是只考虑集合 \(S\) 中公司的边形成的生成树数量,答案显然就是一个简单容斥:
复杂度 \(O(2^{n-1} n^3)\)。
LgP3317。裸矩阵树。发现形式是
那么你把前面的 \(\prod\) 里面乘一个 \(\frac{1}{1-p_{e}}\),后面里面乘一个 \(1-p_e\) 就转化成了
后面就是标准矩阵树定理形式。
当然,普通的树能算,有向树也是可以算的捏。
首先 \(D\) 如果是入度的矩阵,答案就是外向树。
如果是出度的矩阵,答案就是内向树。当然忘了造两组试一下就行。
然后有向树要指定根,你删掉 \(M\) 的哪行哪列就是指定哪个点(无向图是无根树,根对答案无影响,所以删任意点就相当于随便指定一个根)。
LgP5406。矩阵树定理+FWT,奇怪的东西。
先要发现求最值是困难的,考虑计数然后求最大的数量不为0的答案。
因为矩阵树定理求的是 \(\sum_T \prod_{p_e\subset T} p_e\),这个题里的不是 \(prod\),而是一个给定的线性变换。于是联想到 \(FWT\)。对于每条边 \((i,j)\) 的不同边权构造一个集合幂级数,然后做一遍相关线性变换的 \(FWT\),之后直接对于每个值 \(w\) 的行列式求值,得到答案序列 \(c_i\),然后把 \(c\) \(IFWT\) 回去,就得到了答案。感性理解下是对的。复杂度 \(O(n^3 2^w)\)。
这里涉及到 \(FWT\) 的一个本质,就是 \(FWT\) 可以做任意线性变换的情况。