ATB306H Balance Scale 学习笔记
ATB306H Balance Scale 学习笔记
题意简述
给定一个 \(n\) 点 \(m\) 边的简单无向图 \(G\)。可以把一些边改为有向边,之后彼此由无向边连通的点集会缩成一个点。问有多少种操作方案可以使缩点后的图是 \(\texttt{DAG}\)?。
\(n\le 17\)。无重边,无自环。
做法解析
前置知识:\(\texttt{LGP6846}\)。
你如果做过上述那道题就会发现,如果所有边都要求定向的话这题和那题就本质相同了。那本题怎么“归约”上去呢?
我们写一下 \(\texttt{LGP6846}\) 的转移式子:\(F_S=\sum_{T\subset S,T\neq\varnothing}(-1)^{|T|-1}F_{S-T}\),其中 \(T\) 必须是独立集。我们发现,到了本题里面,即使 \(T\) 不是个独立集,我们也可以做转移——我们转移时的约束实际上是所有有向边关系都来源于 \(T\to S-T\),\(\texttt{LGP6846}\) 那道题只允许有有向边,所以 \(T\) 内部不能有别的边;而这道题里面,那 \(T\to T\) 的边不就正等价于那些不做处理而最后会缩掉的无向边么?
容斥系数也得跟着改一下,从 \((-1)^{|T|-1}\) 变成 \((-1)^{G_T-1}\),其中 \(G_T\) 表示只考虑 \(T\) 且不给 \(T\) 中任何边定向,缩点后的点数。\(G\) 数组怎么求呢?对于每个点集 \(S\),我们都遍历图上的 \(m\) 条边,尝试用并查集合并相连通的点,最后连通块个数就是 \(G_S\) 的值了。很暴力,但是可以过。
代码实现
未使用子集卷积。
浙公网安备 33010602011771号