2-SAT 专题
2-SAT 专题
2-SAT 连边时,不要忘记逆否命题也要连边。
如何构造方案
对连出的有向图缩点得到 DAG,并求出每个点所在的 SCC \(id_x\)。
若对于一个布尔变量,其 \(0,1\) 取值所在的点在同一个 SCC 内,则一定无解。
否则,对每个布尔变量取 SCC 拓扑序较大的那个,也就是 \(id\) 较小的那个取值。
证明:
只对一个布尔变量考虑,是合法的。现在考虑两个布尔变量之间的关系。
若 \(x_0\) 推出 \(y_0\),则 \(y_1\) 推出 \(x_1\)。得出 \(id_{x_0}\leq id_{y,0},id_{y_1}\leq id_{x,1}\)。
Problem A. P5532 [JSOI2019] 精准预测
设布尔变量 \(f_{x,t},g_{x,t}\) 表示 \(x\) 人在 \(t\) 时刻是否活着/死了。
活着的时候是一个前缀,所以 \(f_{x,t}\rightarrow f_{x,t-1},g_{x,t}\rightarrow g_{x,t+1}\)。
对每一条预测根据意思连边即可。
然后考虑如何计算答案,\(Live(x,y)=1\) 当且仅当 \(f_{x,T+1}\) 推不出 \(g_{x,T+1}\)。由于我们连边都是带着逆否命题一块连,所以只需要判一边即可。
观察得建出的图没有环,所以转化为 DAG 可达性问题,上 bitset 可以做到 \(O(n^2/w)\)。但是直接开空间不够,那就每 \(B\) 个一起做,取 \(B=10^4\) 可过。
注意若 \(f_{x,T+1}\rightarrow g_{x,T+1}\),则 \(x\) 必死,需要特判。
https://www.luogu.com.cn/record/229289963
Problem B. P3825 [NOI2017] 游戏
首先 \(O(3^d)\) 枚举每个 \('x'\) 是什么,然后继续做。
建点 \(f_{x,A/B/C}\) 表示 \(x\) 是否选择 \(A/B/C\)。由于每个 \(x\) 都有禁止的车,所以只需建出两个点。
对 \(m\) 个规则连边。若 \(x\) 禁止使用 \(y\) 车,那么令 \(f_{x,y}\) 向另一个点连边。
但 \(O(3^d(n+m))\) 过不掉。发现每个 \('x'\) 只需枚举两种车就可以覆盖每种情况,所以降为 \(O(2^d(n+m))\),可过。
https://www.luogu.com.cn/record/218049600
Problem C. P6378 [PA 2010] Riddle
对每条边的限制直接连边,对每个部分的限制需要前后缀优化建图。
但可能出现每个部分没有选出的点的情况,发现我们在没有选出点的部分中随意钦定一个点选出不会使答案非法。
https://www.luogu.com.cn/record/179744614
Problem D. CF1215F Radio Stations
设 \(g_{x},h_x\) 表示 \(x\) 号基站是否被选择/不被选择。基站之间的限制直接连边。
但基站与主频的限制不好处理。
考虑 \(f\in[l_i,r_i]\) 的限制可以拆为 \(f\in[1,r_i]\land f\notin [1,l_i-1]\)。
所以建出 \(M\) 个点 \(f0_i,f1_i\),表示主频是否满足/不满足 \(\leq i\),连边即可。最后需要找出 \(f1_i=1\land f0_{i=1}=1\) 的点。
注意取值类的 2-SAT 问题设计状态时一般考虑是否 \(x\leq k\) 而不是 \(x=k\),因为不好刻画 “\(K\) 个点中恰好取一个”,也不好构造方案。
https://codeforces.com/contest/1215/submission/285555037
Problem E. 【UER #6】寻找罪犯
很多限制,需要好好理一理。
考虑每一条证词 \(i\):
-
\(i\) 的真假可以推出 \(y\) 是否为罪犯;
-
\(y\) 是否为罪犯可以判断 \(i\) 的真假;
-
若 \(i\) 为假,则 \(x\) 一定为罪犯;
-
若 \(i\) 为假,则 \(x\) 所说其他证词都是真的;
-
若 \(x\) 已经有一条证词 \(j\) 为假,则 \(i\) 为真;
-
若 \(x\) 不是罪犯,则 \(x\) 所说证词都是真的。
对每个人与每条证词建立两个 bool 变量,连边跑 2-SAT 即可。注意第 4,5 条限制需要前后缀优化建图。

浙公网安备 33010602011771号