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))\)

请提醒我联赛后记得写代码。

posted @ 2020-09-10 20:05  Soulist  阅读(159)  评论(0)    收藏  举报