2-sat
是啥
给定一些 bool 变量,和一些形如「某 bool 为 true/false 则另一个 bool 必然为 true/false」的条件,问是否有解(并构造)。
构图
将 个 bool 变量拆成 个点,分别表示某 bool 取 true/false 的情况。
首先我们要知道条件 :
所以假设我们有条件「 若为 true,则 为 false」,则我们这样连边:
其中绿色边代表逆否命题。
所以我们就得到了一个最基础且最关键的 2-sat 性质:
对称性: 若 向 连边,则 的对面向 的对面连边。
假若我们要固定一个 bool 为 true 咋办(false 同理):
即将命题转化为「若 为 false,则 为 true」(这样 只能为 true),注意此图仍然满足对称性。
缩点
没错,用 tarjan 将这个有向图缩点。
我们接下来证明:
此 2-sat 有解 不存在两个对面对的点处于同一个 SCC 中。
充分性
假设存在两个对面对的点处于同一个 SCC 中。那这个 bool 若为 true 则能推至 false,false 能推至 true,矛盾。
必要性
假设不存在两个对面对的点处于同一个 SCC 中且 2-sat 无解。
我们对于每一个 bool 构造:若 bool 的一个状态 能推到 ,则我们选择 状态,否则 无法互相推,随便选。
此时必然无解,假设是某一个 bool 的 推到了 。但是由于我们的构造方案,得出 能够推到 。这样发现 在同一个 SCC 中,矛盾。
构造
若判得有解,我们尝试构造一组解。
其实我们的构造方法就在上面的证明里。
我们用 tarjan 对 SCC 进行染色。由于tarjan 是逆拓扑序,所以我们每次在 bool 的两个状态中选颜色更小的即可。
本文来自博客园,作者:ShaoJia,版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义