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

浅谈 2-SAT

时间:2023-08-07 21:58:42浏览次数:36  
标签:至多 浅谈 一个 neg 平面图 即可 SAT

SAT 是适定性(Satisfiability)问题的简称。一般形式为 k - 适定性问题,简称 k-SAT。而当 \(k>2\) 时该问题为 NP 完全的。所以我们只研究 \(k=2\) 的情况。

而 2-SAT 问题一般指的是,有 \(n\) 个布尔变量 \(x_1,x_2\dots x_n\),现在有若干个二元的运算,是对于 \(x_i,\neg x_i,x_j \neg x_j\) 进行 \(\land,\lor\) 或 \(\oplus\),运算,问是否存在一种分配方式,使得所有的这些运算均为真。

因为它是二元的,所以叫做 2-SAT。

解决这个问题的关键就是将所有的逻辑语句统一,统一成 \(p\to q\) 的形式。即 “如果选择了 \(p\),就必须选 \(q\)”。

这样,我们将所有的 \(p\to q\) 看作有向边,我们可以得到一张有向图。

那么我们可以知道,在同一个强连通分量中的所有点,要么同时选择,要么同时不选择。我们跑 Tarjan 缩强连通分量之后,会得到一个 DAG。

这是无解的条件就很明显:如果存在 \(x_i\) 和 \(\neg x_i\) 在同一个强连通分量之中,则说明无解。然后我们对整张图进行缩成的 DAG 进行拓扑排序,每一个变量选择拓扑序较大的决策即可。

Luogu P4782 【模板】2-SAT 问题

有 \(n\) 个布尔变量,有 \(m\) 条件为 \(x_i\) 为真/假或 \(x_j\) 为真/假。询问是否有合法解,并给出一组构造。

每一个操作形如 \(a\lor b\),相当于 \(\neg a\to b\land \neg b\to a\),建图即可。

[JSOI2010] 满汉全席

有 \(n\) 种食材,每种食材要做成两种食品中的一个,有 \(m\) 个要求,每一个形如至少要有两种食品中的一个,问是否可以满足所有要求。

和上面一道题形式几乎相同。

[HNOI2010] 平面图判定

给定一张图,并给出他的一个哈密顿回路,判断这张图是否可以变成平面图。

根据平面图的定理,可以得到平面图的边数至多为 \(3n+6\) 条,那么对于每一个不在哈密顿回路上的边,它要么在环外,要么在环内。
对于每一对边,暴力判断他们同时在环外或环内是否会有交,如果有,则他们之间会出现 \(x_i\oplus x_j=1\) 的限制,拆成 \(x_i\leftrightarrow \neg x_j\),\(\neg x_i\leftrightarrow x_j\) 即可。
由于这个限制是双向的,可以直接使用并查集维护。

[北京省选集训2019] 完美塔防

不难证明,每一个 . 至多只会被两束合法的激光覆盖,具体的,因为没有任何可以使光线回合的一起,每一个方向至多只会有一条激光,而如果相对的方向都有激光则说明这样的组合是不合法的,因为他们会打到另一个仪器。

所以直接暴搜查询每一个点是否会被哪些光遍历,以及哪些光是合法的这样的操作复杂度是正确的,然后对于每一个位置,都是 \(a\) 或 \(b\) 的信息,直接见图跑 2-SAT 即可。

[NEERC2016] Binary Code

有 \(n\) 个 \(01\) 串,每个串至多有一个位置是不确定的,问是否有一种确定每一个不确定位的方式,使得没有任何一个串是另一个串的前缀。

由于每一个串至多有一个不确定位,相当于是在两种可能中选择,暴力连接所有可能的前后缀是 \(O(n^2)\) 量级的边数,显然无法接受,所有考虑优化建边的过程。

具体的,我们考虑建出Trie树,这样每一个点的前后缀关系都可以在树上轻松表示出来,建两颗辅助的Trie树,一个向叶,一个向心即可,边数是 \(O(\sum |S|)\) 的,再跑 2-SAT 即可。

标签:至多,浅谈,一个,neg,平面图,即可,SAT
From: https://www.cnblogs.com/Xun-Xiaoyao/p/17612695.html

相关文章

  • [React Typescript] Ensure correct inference for prop types with satisfies & Comp
    import{ComponentProps}from"react";import{Equal,Expect}from"../helpers/type-utils";constbuttonProps={type:"button",//@ts-expect-errorillegalProperty:"IAMILLEGAL",}asconstsatisfiesC......
  • 浅谈PLC程序命名3大通用规则
    导读工程师在编写PLC程序时,可能需要对项目中的程序块、变量表、单一背景数据块、全局DB块等命名。在博途软件中支持中文和英文的命名。但是一旦程序量比较大,命名可能就会出现混乱的现象。针对命名,只要读者遵循相关命名规则就不易发生混乱。本文以博途软件为例进行探讨。01......
  • 浅谈伯努利数
    O.前言在翻洛谷日报的时候居然没看到伯努利数的讲解,于是有了这篇文章。想要看懂本文,你需要提前知道以下内容:二项式系数;幂级数;艾弗森括号;下降幂;第二类斯特林数。部分内容在文中给了对应的公式,故不放在前言内。I.伯努利数的定义:万恶之源\(m\)次幂的求和公式1.伯努......
  • 浅谈如何给.net程序加多层壳达到1+1>2的效果
    合集-.net代码混淆加密产权保护(3) 1.记一次.net加密神器Eazfuscator.NET2023.2最新版使用尝试06-272.将SmartAssembly与单文件可执行文件一起使用(.NETCore6)06-273.【干货】浅谈如何给.net程序加多层壳达到1+1>2的效果08-05收起 软件破解分白盒和......
  • 浅谈非栈上格式化字符串
    浅谈非栈上格式化字符串这里先浅分析修改返回地址的两种打法,分别是"诸葛连弩"和”四马分肥“修改返回地址本文例题以陕西省赛easy_printf为主简单看一看程序需要先过一个判断然后进入vuln进入后有一个13次的循环可以让我们操作第一步肯定要先leak出栈地址程序......
  • 极光笔记 | 浅谈企业级SaaS产品的客户成长旅程管理(上)—— 分析篇
    本文作者:陈伟(极光用户体验部高级总监)“企业级SaaS产品与C端互联网产品特征差异很大,有些甚至是截然相反,这些特征也会成为后续客户成长旅程的重要影响变量。本文就如何设计并服务好企业级SaaS产品客户成长旅程进行分析总结,希望对你有所启发。”大家肯定好奇,标题为什么不直接借用c端互......
  • 浅谈-HttpSession session = request.getSession(false)
    当使用request.getSession(false)方法时,如果当前请求没有关联的会话,则不会创建新的会话,而是返回null。这意味着,如果当前客户端没有携带有效的会话标识符(如JSESSIONID),或者会话已过期或被销毁,则request.getSession(false)方法将返回null。下面是一个示例来解释这个方法的用......
  • 浅谈 rxgo 在项目中的使用方式
    项目中使用到了RxGo,感觉现有的处理方式有一定的优势,当然也有一定的有劣势,遂记录下来,免得自己忘记。本文介绍的只是rxgo的一种方式而已,如果你有不错的使用方式,请不吝赐教,谢谢。对rxgo不清楚的同学可以看看我的另一篇文章,主要是介绍rxgo的基础使用。Go中响应式编程库Rx......
  • 前端性能优化的利器 ——— 浅谈JavaScript中的防抖和节流
    防抖和节流函数是工作中两种常用的前端性能优化函数,今天我就来总结一下什么是防抖和节流,并详细说明一下如何在工作中应用防抖和节流函数什么是防抖和节流?在JavaScript中,防抖(debounce)和节流(throttle)是用来限制函数执行频率的两种常见技术。防抖(debounce)是指在某个时间段内......
  • Java后端03(浅谈注解)
    注解功能一:提示信息功能二:存储信息​ 注解需要定义注解类,类对象需要有落实的实体,注解可以出现在类Class上,方法Method上,成员变量Field上以及构造方法Constructor上,注解对象需要被添加注解的实体所对应的反射对象进行获取,人话:要获得注解信息,首先要获得修饰的东西的反射......