2-SAT学习小记
来源:互联网 发布:alien skin bokeh mac 编辑:程序博客网 时间:2024/05/16 11:40
推荐博客:【研究总结】2-sat问题
问题描述:
现在有n个集合,每个集合里有一些元素。
现在要求从每个集合里选出一个元素,并且两两集合选出的元素有限制……
记一个集合里最多有k个元素,那么这个问题称作k-sat问题。
k=2即是2-sat问题,是有价值讨论的问题。
当k>=3时,被证明是NP完全问题,是无法在多项式复杂度内求解的。
例题引入:
poj上的一道裸题。
有n个未知数x,值只能是0或1。
现在给出若干限制如:
1.x[a] and x[b] = 0
2.x[a] and x[b] = 1
3.x[a] or x[b] = 0
4.x[a] or x[b] = 1
5.x[a] xor x[b] = 0
6.x[a] xor x[b] = 1
问是否有解?
解法:
按某大神所说,2-sat就是一个在图上暴力的玩意儿。
首先拆点,每个未知数拆成2个点,一个代表0,一个代表1。
很明显满足之前所说的,就是每组必须选一个点。
定义一条有向边a->b的意义为选了a就必须选b,逆命题是不选b就不选a。
设把x拆成了x0,x1,y拆成了y0,y1
x0,y0分别表示原来的x,y选0, x1,y1分别表示原来的x,y选1。
以x and y = 0为例.
则选了x1就必须选y0,选了y0就必须选x1.
所以按规则连边.
如果x and y = 1
则一定不能选x0,y0
且选了x1,就必须选y1,选了y1,也必须选x1.
后者照样连边。
前者连x0->x1,y0->y1,至于这样做为什么是对的可以从后面的判断方法和求解方法得到答案。
对于其它的位运算,可以得到类似的连法。
判断方法:
1.如果图中有x0和x1在一个强联通分量里,显然无解。因为x0,x1必须选一个,而选了一个就会选另外一个。
2.如果对于任意的x0,x1都不在一个强联通分量里,则至少有一组解。证明可以从后面的求解方法得到。
求解方法:
将每一个强连通分量缩环,建个Turpo序,然后倒着这样做:
对于当前的点x,如果它没有被标记为不可选,则把它标记为选了,注意x是缩环以后的点,把x环上面的点的相反点全部标记为不可选,一直这样做就可以得到一组解了。
正确性?
假设有x0能走到x1,那么我只能选择x1,而不能选择x0.
Turpo倒序以后,我一定是到x1,并且x1一定不会被标记为不可选,然后x1标记为选了,再把x0标记为不能选。
这个讲法全是口胡,如果想知道具体的证明,还是看文章开头推荐的那篇博客吧。
推荐例题:51nod 1318 最大公约数与最小公倍数方程组
这题好像是51nod 上2-sat专题里的唯一的一道题,后一篇博客会讲。
- 2-SAT学习小记
- 2-SAT阶段性学习小记
- 2-sat 问题学习小记 Poj 3207 Ikki's Story IV - Panda's Trick (可行性判定)
- 2-SAT 学习笔记
- 2-SAT学习资料
- 2-SAT学习笔记
- [学习笔记]2-SAT
- 2-SAT学习总结
- 2-SAT学习笔记
- quest3D学习小记2
- ORACLE学习小记(2)
- php学习小记2
- Python学习小记2
- HTML学习小记2
- |算法讨论|2-SAT 学习笔记
- 2-SAT(心累时学习的算法)
- quartz-2.0.2学习小记
- 网络流 学习小记2
- [洛谷P1378]油滴扩展
- 清华x-lab AI研习社 | 创新工场王咏刚:人工智能在线下落地难不是问题,而是巨大的机遇
- 人工智能将如何改变公司战略:亚马逊思维试验
- Android学习路线指南
- C语言提高-第23/24/25讲: 指针的运算/数组名作为函数参数/指针作函数参数(一维数组Vs指针)
- 2-SAT学习小记
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- bzoj 4403: 序列统计 lucas定理+组合数学
- AI世界:2018年八大趋势
- tableLayout
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 洛谷 P1084 疫情控制 (二分答案+倍增+贪心)
- Android 转场动画 windowAnimation和ActivityAnimation的区别
- 完爆程序员!谷歌AI写的机器学习代码竟如此高效