转载:http://blog.csdn.net/luyuncheng/article/details/15172827

此题好纠结啊。。。其实2-sat关键是建边

此题网上好多题解都是直接说了建边而且建边完全没有解释清楚,说了的也都是模模糊糊完全不能让人信服啊啊啊啊

反正我是没有找到一个能让我完全理解的

索性自己想了下,我的建边以及证明如下:

因为公式不好贴,我有些是发的图有些是自己打的符号,复制粘贴的时候难免有问题,还有就是貌似网页字符有时候会和我自己手打的符号产生矛盾,会显示不出来,如有问题请指出。

说先说下2-sat


对于布尔方程的合取范式:(a∨b∨。。。)∧(c∨d。。。)

中a,b,。。。称为文字,他是一个布尔变量或其否定,像(a∨b∨。。。)这样用∨析取连接的部分称为子句。如果合取范式的每个子句中的文字个数都不超过两个,那么对应的sat问题称为2-sat问题

建边问题,首先利用=>蕴涵表达式将每个子句(a∨b)改写成等价形式。这样原布尔公式就变成了把(a=>b)形式的布尔公式用∧连接起来的形式。对每个布尔变量x,构造两个顶点分别代表x和~x,以=>关系为边建立有向图。此时,如果图上的a点能够达到b点的话,就表示当a为真时b也一定为真。因此,该图中同一个强连通分量中所含的所有文字的布尔值均相同。

如果存在某个布尔变量x,x和~x均在同一个强连通分量中,则显然无法令整个布尔公式的值为真,反正,如果不存在这样的布尔变量,那么对于每个布尔变量x,让

X所在的强连通分量的拓扑序在~x所在的强连通分量之后 < =>x为真

以上摘自《挑战程序设计竞赛》

好,现在我们还要将逻辑语句化成范式

AND语句就是自己本身的范式A∧B

a AND b==1:(a∨a)∧(b∨b)

a AND b==0:(~a∨~b)∧(~b∨a)

OR语句可以看成a∨b

a OR b==1:就是上面的(a∨b)等价形式

a OR b==0:换成合取范式为1的可以全部取非 化成~a∧~b

然后可以看成 (~a∨~a)∧(~b∨~b)

异或语句也是最难的:

首先异或操作可以看成:a XOR b == ~(a <–> b)
== ~ [ (a->b)∧(b->a) ]
== ~ [ (~ a ∨ b)∧(~ b ∨ a) ]
== [~(~a∨b)] ∨ [~(~b∨a)]
== (a∧~b) ∨ (b ∧ ~a)
得到析取范式:(a∧~b) ∨ (b ∧ ~a)
然后转换成合取范式(这里我不知道公式,望大神指教公式。我是用分配率一个个换进去的)
(a∧~b) ∨ (b ∧ ~a) ==[ (a∧~b)∨b ] ∧ [ (a∧~b)∨~a ]
==(b∨a)∧(b∨~b)∧(~a∨a)∧(~a∨~b)
好了如果a XOR b ==1 有(b∨a)∧(b∨~b)∧(~a∨a)∧(~a∨~b)
a XOR b ==0 由于前面那个退单范式中有个是因为前面加了~的
所以取~就是: (~a∨b)∧(~b∨a)
好了现在开始建边了
建边就根据前面说的对于每个(a∨b),~a连边到b.~b连边到a.
这也就是
a and b ==1 : ~a->a , ~b -> b
a and b ==0 : a->~b , b->~a
a or b ==1 : ~a->b , ~b->a
a or b ==0 : a->~a , b->~b
a xor b ==1 : a->~b,~b->a,~a->b,b->~a
a xor b ==0 : a->b,b->a,~a->~b,~b->~a
那么hdu4421就是将每一个int32的整数每一位拿出来做同样的操作就好了

2-sat相关知识的更多相关文章

  1. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  2. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  3. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  4. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  5. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  6. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  7. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  8. 电路相关知识--读<<继电器是如何成为CPU的>>

    电路相关知识–读<<继电器是如何成为CPU的>> */--> *///--> *///--> 电路相关知识–读<<继电器是如何成为CPU的> ...

  9. 地址标记,SpringMVC转发与调用相关知识存档

    1.mytest_mavenprj1中,index的 <a href="login/login.html">点击登录</a> 与 <a href=&q ...

  10. AJAX跨域调用相关知识-CORS和JSONP(引)

    AJAX跨域调用相关知识-CORS和JSONP 1.什么是跨域 跨域问题产生的原因,是由于浏览器的安全机制,JS只能访问与所在页面同一个域(相同协议.域名.端口)的内容. 但是我们项目开发过程中,经常 ...

随机推荐

  1. 关于OPPO手机的生存和程序员的发展

    关于程序员私下讨论最多的话题,除了哪个编程最牛逼之外,哪款品牌的手机最牛逼也是我们谈论最多的话题之一吧!有的喜欢罗永浩,自然就是锤粉:有的喜欢苹果,称它为工业时代最优美的艺术品:当然,我想也有很多的人 ...

  2. CSS综合用法

    div 居中 {position: absolute; top: 50%; left: 50%; margin-top: -180px; margin-left: -160px;}

  3. 公众号如何获取已关注用户的unionid的问题

    避免误导,先加一句:首先,得公众号绑定开放平台 这个问题困扰了我一早上,我尝试了很多次获取unionid都失败. 微信的开发文档上有说: 关于特殊场景下的静默授权 1.上面已经提到,对于以snsapi ...

  4. Django model 反向引用中的related_name

    转自:https://blog.csdn.net/lanyang123456/article/details/68962515 问题: 定义表Apple: class Apple( models.Mo ...

  5. PHP流程控制考察点

    php遍历数组的三种方法及各自的区别 php遍历数组的方式主要有三种: for循环 foreach循环 while.list().each()组合循环 其中: for循环只能遍历索引数组,foreac ...

  6. c++ 数组长度

    数组长度求解 sizeof template <class T>int getArrayLen(T &array){ return (sizeof(array) / sizeof( ...

  7. PHP 中 echo 和 print 的区别

    一般来说,PHP中动态输出HTML内容,是通过print 和 echo 语句来实现的,在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也 ...

  8. LAME的“命令行”

    VBR 编码 (强烈推荐) Alt Preset Extreme (平均256kbps) 我们有时在网上可以看到".LAME-APX." 就是这种形式,我们也可以在文件名中包含这个 ...

  9. Jupyter IPython dead kernel and do not restart

    本人遇到的情况:dead kernel & try to restart failed 查看CMD发现这个库安装有问题 解决办法 1.pip uninstall backports.shuti ...

  10. Spring Boot . 2 -- 用Spring Boot 创建一个Java Web 应用

    通过 start.spring.io 创建工程 通过 IDEA 创建工程