当前位置: 首页 > news >正文

2-SAT学习笔记

问题

给出一些\(0/1\)选择和一些约束条件,求出一组满足所有条件的解


为方便叙述,我们把第 \(i\)\(0/1\) 选择表示为 \(ai,0\), \(ai,1\)

首先观察性质,\(ax,t,ax',t'\) 冲突意味着两者只能选其一。有了这个性质,我们进一步发现 \(ai,0,ai,1\) 其实也是冲突的。也就是说我们可以把\(0/1\)选择 和 冲突 全看成 \(0/1\)选择

然后我们来看\(0/1\)选择的性质

如果 每个限制 都是在两者中选其一,不难想到我们可以建立两个相互对立的点来表示限制。

如果我们将这些对立的点对应 用边相连,我们不难发现这是一个二分图,并且我们要找到一个点集 \(S\),使得点集 \(S\) 中的点相互没有连边,且\(|S|≥n\)

我们可以发现这是个裸的最大独立集问题,利用\(dinic\),我们可以得到一个时间复杂度为 \(O(m\sqrt{n})\) 的算法,其中 \(m\) 为限制条数(二分图中边数)

但这个算法依然不是很优秀,我们继续思考。

现在连的边代表限制,这样的边并不能满足图论中最基础的性质:传递性。例如:对于 \((a,b),(b,c)\) 两条边,我们只能得知\(a,b\)不在一个集合,以及\(b,c\)不在一个集合,但我们不能得到\(a,c\)一定在同一个集合,因为 \(c\) 可能还有其他限制,导致 \(c\) 不选比选更优。

因此考虑重新连边,我们把目光重新聚焦到 \(0/1\)选择 上,我们不难发现如果我们确定了\(ai,0,ai,1\)其中一个不选,那么另一个一定要选。那么我们就可以把先前的图重构,即 对于\(∀(ax,y,az,w)∈E\)连接\((ax,y,az,w')\),若\(w=1\),则\(w'=0\);反之亦然

注意:同一个\(0/1\) 选择中的\(a_{x,0},a_{x,1}\)之间不再需要连边,因为这种边在新图中以自环的形式存在,因此不再在之后的操作中不再考虑。

这样边\((u,v)\)的实际意义为选了\(u\),就必须选\(v\)。这样便就满足传递性了。那这样有什么好处呢?

注意到对于有向图中的一个强连通分量(即对于强连通分量中的每个点都能将自己 \(0/1\) 选择的状态传递给强连通分量中的任意一个点),因此强连通分量中每个点的状态都相同。

但是如果同一个 \(0/1\) 选择 \(ax,0,ax,1\) 都在同一个连通块,即同时都要选或同时都不选,就会产生矛盾

这时已经没有边 \((ax,0,ax,1)\),只有边 \((ax,0,ax,0),(ax,1,ax,1)\)

那么对于全图,可以用\(tarjan\)来将强连通分量缩点,再用拓扑排序,求出一组可行方案

http://www.jsqmd.com/news/27881/

相关文章:

  • 打造自己的 Claude Code:LangGraph + MCP 搭建一个极简的 AI 编码助手
  • CSP-S 2023-2024 分析
  • 专栏目录
  • 代码大全2 第四五章
  • 程序员修炼之道:从小工到专家读后感1
  • 代码大全2阅读1
  • 代码大全2阅读2
  • 软件工程学习日志2025.10.30
  • BOE(京东方)“百堂故宫传统文化公益课”暨2025照亮成长路收官 推动“科技+教育+文化”可持续发展
  • Java的深层逻辑与未来生态延伸
  • 软件工程学习日志2025.10.31
  • Java:从跨平台梦想到生态帝国的编程语言
  • [KaibaMath]1016 关于数列与其子数列下标不等关系的证明
  • MySQL解析JSON格式字段并取出部分值的方式
  • 【详细介绍】一种基于斜二进制的序列树上数据结构
  • drm分析
  • 8、认识for循环
  • node.js安装搭建
  • 102302156 李子贤 数据采集第二次作业
  • 2025年储能线束生产厂家排名:众晟强电子领先
  • SVD分解及其应用
  • 2025年工业线束生产厂家排名前十强,东莞众晟强电子引领行业创新
  • 完整教程:【C语言数据结构】第2章:线性表(1)--定义ADT
  • 【论道】前端动画总结
  • 软件构建,藏在细节里的“工程思维”
  • 从“会编码”到“懂开发”,一场开发者的认知升级
  • Mac版4K Video Downloader Plus Pro v1.5.2安装教程|dmg文件下载后拖拽到应用程序教程
  • 把coarse粗调音高转换成频率的数学公式
  • 思科vManage漏洞分析:四漏洞链实现未授权远程代码执行
  • Java流程控制练习——打印三角形及debug调试