首页 > 其他分享 >浅谈2-SAT

浅谈2-SAT

时间:2022-09-20 23:00:24浏览次数:89  
标签:连通 浅谈 一组 neg 拓扑 建边 SAT

用处

给 \(n\) 个 \(0/1\) 变量,其之间满足若关系,这些关系本质上可以化成:若 \(a_i\) 为 \(0/1\),则 \(a_j\) 为 \(0/1\) 的若干命题,2-SAT 就是判断是否能够满足所有命题,并给出一组可行解(\(n^2\) 可得字典序最小的特解)。

一般解法

考虑建图,每个变量拆成真假两点,命题可以抽象出若干条如:若 \(i\) 则必须 \(j\) 形式的 \(i\to j\) 的边。如果 \(i\) 与 \(i\) 的逆否命题 \(\neg i\) 位于同一个强连通分量中,则无解,反之必定存在解,考虑怎么构造一组解。

强连通分量构成的图为一张 DAG,先给出结论:如果 \(i\) 所在强连通的拓扑序在 \(\neg i\) 的之后,则选 \(i\)。

感性理解:如果 \(i\) 的强连通拓扑序越后,则它能影响到的点更小,显然更优。

具体证明:反证法讨论每种情况,矛盾都很显然,注意抓住建出的图是具有对称性的一点思考。

一般实现为 tarjan 求强连通,注意 tarjan 是 dfs 顺序,相当于一个栈,出栈时顺序会倒一下,所以先到的强连通拓扑序越大。

一些常见建边

别人有总结,我觉得还是根据选 \(i\) 必选 \(j\) 的建边原则思考普适性要大一些。

一些题

题单,Part 1 不讲。

UVA1391 Astronauts

看似每个人有三个选项,实际上还是两个,所以直接2-SAT,\((i,j)\) 关系不好就是 \(i\to \neg j,\quad j\to \neg i\)。

P3513 [POI2011]KON-Conspiracy

发现是一个团(集合内全互相有边)和一个独立集(集合内任意都无边),考虑如果我们知道一组可行解,怎么变成其他解。不难发现,只能从团拿一个元素去独立集、独立集拿一个元素去团、团和独立集交换一对元素三者中选一个进行变换,模拟一下统计能有几种变换即可。

P3825 [NOI2017]游戏

对于 \(a,b,c\) 都是只能选两个值,但是 \(x\) 能选三个,这就不满足2-SAT了,但是我们可以枚举 \(x\) 是 \(a,b,c\) 中哪个来转换成 2-SAT 问题,但是发现 \(a\) 包括选 \(B,C\),\(b\) 包括选 \(A,C\),已经可以表示出 \(x\) 的所有车辆选择了,所以只用 \(2^d\) 枚举 \(a,b\) 中哪个就好了。

建边:对于一组 \((i,h_i,j,h_j)\) 如果 \(i\) 图和 \(h_i\) 车矛盾,则不建边。反之,如果 \(j\) 图与 \(h_j\) 矛盾,则不可选 \(h_i\),所以 \(i \to \neg i\),再反之,\(i\to j\) 且 \(\neg j \to \neg i\)。

标签:连通,浅谈,一组,neg,拓扑,建边,SAT
From: https://www.cnblogs.com/Quick-Kk/p/2-sat.html

相关文章

  • mysql中nvl_浅谈Mysql中类似于nvl()函数的ifnull()函数
    IFNULL(expr1,expr2)如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。mysql>selectIFNULL(1,0);->......
  • IPv6升级有几种方式?浅谈浅谈IPv6改造方案
    随着我国5G网络、数据中心等新型基础设施建设的推进,“数字化转型”已成为近年社会发展的主基调。作为互联网数字化转型的基础,IPv6网络的部署早已不是一个“如果”,而是一个......
  • 浅谈Flexray基础通讯测试
      随着车载网络发展,ECU的通讯速率相较以往得到飞速提升。现今多数OEM在中高速通讯场景中仍采用CANFD进行过渡,但当同时考虑安全和更高带宽要求时,CANFD则无法满足,FlexRay则......
  • C++ 头文件接口设计浅谈
    C++头文件接口设计浅谈作者:独钓寒江雪链接:https://zhuanlan.zhihu.com/p/338227526对于很多出入门C++的程序员来说,大部门新手都是在用别人封装好的库函数,却没有尝试过......
  • 浅谈软件工程——写在学习之前
    写在前面该blog用于记录本人与2022年秋学习软件工程的历程和感悟。今天先简要地谈谈在正式学习前对软件工程的理解,主要内容来源于曹健老师的第一节课以及通过网络收集的......
  • Java中的SPI原理浅谈
    在面向对象的程序设计中,模块之间交互采用接口编程,通常情况下调用方不需要知道被调用方的内部实现细节,因为一旦涉及到了具体实现,如果需要换一种实现就需要修改代码,这违......
  • 浅谈 高并发 处理方案
      文章目录  高性能开发十大必须掌握的核心技术I/O优化:零拷贝技术I/O优化:多路复用技术线程池技术无锁编程技术进程间通信技术Scale-out(横向拓展......
  • 浅谈扫描线
    准备学习扫描线的时候,发现洛谷日报上并没有关于扫描线的文章,于是心血来潮想写一篇。顺便纪念一下我马上结束的OI生涯。前置知识线段树或树状数组(不会的请【模板】线......
  • 浅谈双指针技巧(一)---通过双指针判断链表成环问题
    双指针是算法中非常重要的一个解决问题的思路。双指针顾名思义,就是有两个指针。根据双指针的方向及速度,我们一般将双指针分为以下几种场景1、快慢双指针2、左右双指针所谓......
  • 浅谈display:inline-block
      参考:https://blog.csdn.net/bigboom_/article/details/116058695......