THUPC2019 找树
THUPC2019 找树
定义一个二进制运算 \(\oplus\) 为每一位上执行 \(\mathbf{or}/\mathbf{and}/\mathbf{xor}\),具体每一位的操作给定。
给定一张 \(n\) 个点 \(m\) 条边的无向图,求一棵生成树,最大化边权的 \(\oplus\) 和。
\(n\le 70,w\le 12,m\le 5000\)
其中 \(w\) 为二进制位数。
Solution
感觉见过的套路再见面就比较简单了。
考虑矩阵树定理,每条边定义为一个 FWT 多项式 \(x^{w_i}\),那么用矩阵树定理求解即可。
注意到 FWT 是线性变换,可以先把所有元素 FWT,然后再对每个维度跑矩阵树,然后再 IFWT 回来即可,判定即为最大的 \(k\) 使得这种值存在。
当然,FWT 对于每一位不同也是可以做的。
复杂度为 \(\mathcal O(n^2(n2^w+w2^w))\)
请提醒我联赛后记得写代码。