2-SAT 2

\(2-SAT\)专题的题解

【模板】2-SAT

这题的建图方式还是非常板子的
最简单的写法就是走定义,也就是这样:
G.add(a+(!x)*n,b+y*n);
G.add(b+(!y)*n,a+x*n);
然后要写\(2-SAT\)必然要会\(Tarjan\),我的就是蓝书上写法
然后判断有没有解就是看对应的\(SCC\)编号是不是一样的
最后找解看编号的符号是<

[JSOI2010] 满汉全席

差不多算是双倍经验?
对于一个评委来说
如果一个食材不做他要求的样式,另一个食材必须做
这样连边,连两条
判无解就是是否有一个菜两个样式在同一\(SCC\)
这个题甚至比模板弱一点点
因为没让构造解

[NOI2017] 游戏

一个有意思的\(3-SAT\)
\(d=0\)的情况就是\(2-SAT\)的板子
连边方式:(称输入中的\(i\)图为条件图,\(j\)为限制图)
1.条件图上不让选这个车子,不用连边
因为显然不能这样选,不会有因为这个限制条件产生的矛盾
2.限制图上不让选这个车子,连一个让\(i\)矛盾的边
显然在条件图上选了这个车子直接无解,于是我们就强行建出这个\(SCC\)表示无解
3.以上两种情况外的其他情况
正常的\(2-SAT\)建图即可

然后考虑对于剩下的\(x\)的情况,
考虑到\(d\leq 8\)和传统\(k-SAT\)做法
我们可以考虑让\(d\)作为指数加入进来
暴力枚举\(x\)图上可以选哪两辆车,
使得所有的\(x\)能够凑到一起做\(2-SAT\)
为啥是对的?
因为几种情况枚举下来所有的赛车都是能用的
同时因为\(2-SAT\)可以线性,所以时间复杂度也是对的
注意下常数否则容易被卡

[POI2011]Conspiracy

求方案数,有点意思
首先\(2-SAT\)构建出一组可行解
就是认识的人一个做同谋另一个必然后勤
不认识的人一个后勤另一个必是同谋
然后在此基础上有一个结论:
两个不同的方案,至多有一对阵营不同的人换阵营,
这个还算显然吧,因为后勤两人互相认识,所以不能换两个到同谋,
同理同谋也不能同时换两个到后勤。
然后令\(f_i\)表示可以和\(i\)换阵营的人数目
由上可知\(f_i\leq 1\)时,\(i\)会有贡献
然后考虑分讨:
1.\(f_i=1\),当且仅当\(f_j=0,j\)为换到\(i\)的决策点
2.\(f_i=0\) :
可以直接放到对方阵营(前提条件是该阵营有放人的富余),
也可以与对方阵营中任意个同样无冲突点的点互换
(这个直接用一个\(tmp1\)\(tmp2\)统计一下两边阵营的无冲突点数,最后乘一下就好了),
至于仅以\(i\)为冲突点的情况已在上一种情况中考虑过了,不需要重复算,
可以证明,其他点无法与之交换。

[POI2001]和平委员会

一开始想的是把所有的都当限制条件建边
但是写着写着就假了
其实只需要管给出的限制条件
题目暗含的可以当做判解条件用
把条件转换成这样:
如果这边这个人去了,那边就必须让那个人的盟友去
反过来再连一条跑就行了
判解和构造用同一党派的两个人即可

[NEERC 2016]Binary Code

这个题前缀建图没太懂

posted @ 2022-08-19 17:59  2K22  阅读(37)  评论(0)    收藏  举报