今年noi考了一道2-SAT裸题,害怕今年省选会出到,只能填坑

SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性问题,简称 k-SAT。
当k>2时,k-SAT是NP完全的。因此一般讨论的是k=2的情况,即2-SAT问题。
2-SAT,简单的说就是给出n个集合,每个集合有两个元素,
已知若干个 < a,b >,表示a与b矛盾(其中a与b属于不同的集合)。
然后从每个集合选择一个元素,一共选n个两两不矛盾的元素。
显然可能有多种选择方案,一般题中只需要求出一种即可。

2-SAT问题

现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x] AND A[y]=0、A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系。这个称为SAT问题,特别的,若每种限制关系中最多只对两个元素进行限制,则称为2-SAT问题。

由于在2-SAT问题中,最多只对两个元素进行限制,所以可能的限制关系共有11种:
A[x]
NOT A[x]
A[x] AND A[y]
A[x] AND NOT A[y]
A[x] OR A[y]
A[x] OR NOT A[y]
NOT (A[x] AND A[y])
NOT (A[x] OR A[y])
A[x] XOR A[y]
NOT (A[x] XOR A[y])
A[x] XOR NOT A[y]

注意:
这里的OR是指两个条件至少有一个是正确的
比如x1和x2一共有三种组合满足“x1为真或x2为假”:
x1=1,x2=1
x1=1,x2=0
x1=0,x2=0

2-SAT的解决方法有很多,
由于博主比较蒟,所以就选择一种简单易懂的介绍一下:

算法

构造一个有向图G,每个变量xi拆成两个点2i和2i+1
分别表示xi为假,xi为真
那么对于“xi为真或xj为假”这样的条件
我们就需要连接两条边
2*i —>2*j(表示如果i为假,那么j必须是假)
2*j+1—>2*i+1(表示如果j为真,那么i必须是真)
这就有点像推导的过程
实际上每一个限制条件都会对应两条“对称”的边

接下来逐考虑每个没有赋值的变量,设为x
我们先假定x为假(为什么一定是假,约定俗成了)
之后沿着从ta出发的有向边进行标记
如果在标记过程中,发现有一个点的两种状态都被标记过了
那么我们之前的假设就被推翻了
需要改成x为真,重新标记
如果发现无论这个点赋值成真还是假,都会引起矛盾
可以证明这个2-SAT无解

可能我的叙述有点容易让读者yy
但是一定要注意:

这个算法没有回溯过程

这个课件讲的蛮好
%dalao的blog

下面给出代码:

struct TwoSAT{int n;vector<int> G[N*2];bool mark[N*2];int S[N*2],c;int dfs(int x){if (mark[x^1]) return 0;if (mark[x]) return 1;    //和假设的值一样mark[x]=1;S[c++]=x;for (int i=0;i<G[x].size;i++)if (!dfs(G[x][i])) return 0;return 1; }//x=xval or y=yvalvoid add_clause(int x,int xv,int y,int yv){x=x*2+xv;y=y*2+yv;G[x^1].push_back(y);G[y^1].push_back(x);}void init(int n){this->n=n;for (int i=0;i<2*n;i++) G[i].clear();memset(mark,0,sizeof(mark));}bool solve(){for (int i=0;i<2*n;i+=2)   //枚举每一个点 if (!mark[i]&&!mark[i+1])   //没有标记 {  c=0;if (!dfs(i)){while (c>0) mark[S[--c]]=0;   //清空标记 if (!dfs(i+1)) return 0;} }return 1;}
};

2-SAT(随意写点)相关推荐

  1. 模板 - 2 - SAT问题

    整理的算法模板合集: ACM模板 注意一个坑,2SAT问题中如果要求你输出方案,如果你的代码输出的跟样例不一样,不要着急,因为2SAT 问题本来就是有多解,结果我样例不过,交上去就A了 方案输出时,c ...

  2. 计算机学院 图论方向,成电计算机学院本科生在计算机科学理论方向重要国际会议SAT上发表论文...

    近日,计算机科学与工程学院(网络空间安全学院)2017级本科生和肖鸣宇教授撰写的论文"A Fast Algorithm for SAT in Terms of Formula Length& ...

  3. MIT录取不再看SAT科目成绩:曾是华裔传统优势,数学等学科测验更是中国留学生强项...

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 美国麻省理工学院今天在招生网站上宣布,决定不再考虑将SAT科目考试作为录取过程的一部分. 这一决定从2020~2021学年开始生效. SA ...

  4. 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?

    加州大学欧文分校对于SAT成绩的要求是多少?现在申请美国本科,很多都是需要同学们提供sat成绩的额,下面托普仕留学老师为大家介绍SAT多少分才能申请加州大学欧文分校?同学们在申请之前要多注意院校信息. ...

  5. 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求

    下面为大家介绍的是加州大学欧文分校University of California Irvine的SAT成绩要求.加州大学欧文分校University of California Irvine是美国加 ...

  6. 如何使用SAP事务码SAT进行UI应用的性能分析

    Sent: Wednesday, July 11, 2012 7:49 PM Subject: [Knowledge share]How to trace UI transaction using S ...

  7. 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈

    今天是农历鼠年大年初四,本文是鼠年第4篇文章,也是汪子熙公众号第203篇原创文章. 大家这几天在家里宅得如何了?貌似不少朋友都闷坏了. 我们继续学习. Jerry之前的文章 SAP错误消息调试之七种武 ...

  8. 使用ABAP SAT工具分析SAP OData service实现明细

    Created by Wang, Jerry, last modified on Mar 26, 2015 使用SAT运行OData service测试report: 直接运行report: 确保OD ...

  9. 使用SAT研究IBASE hierarchy读取性能

    Created by Jerry Wang on Mar 06, 2014 1. transaction code SAT,创建一个新的variant例如ZJERRY, 确保Aggregation为N ...

  10. 如何使用SAT trace一个正在运行的程序

    Created by Jerry Wang, last modified on Jul 17, 2014 在SAT tcode中维护需要使用的SAT variant,在这个例子里为ZJERRY.在ta ...

最新文章

  1. 人工智能芯片支持超低功耗器件的推理
  2. 基础002. Editplus编辑远程文件
  3. Linux负载均衡软件LVS
  4. python编程在哪里写-python3.6.3 安装好了在哪里编写程序
  5. http各种中的各种timeout
  6. LeetCode题库第888题 公平的糖果棒交换
  7. QT中IDirect3DDevice9的Present方法失败情况的处理笔记
  8. 分享自己写的一个贪吃蛇的游戏(Linux)
  9. javascript基础系列:DOM相关的技术知识点
  10. 【Tomcat】Tomcat Connector的三种运行模式【bio、nio、apr】
  11. Windows Phone 8初学者开发—第18部分:在页面间导航
  12. Javascript:js借助jQuery和fileSave将表格存储到world
  13. 年终工作总结汇报和述职报告ppt模板,内含范文可参考,精选20套可下载
  14. 坐标变换(1)—向量和坐标系
  15. JVM如何读GC日志以及如何使用工具分析
  16. Windows系统基础配置
  17. 武汉代茜2017级计算机科学与技术,毕业论文致谢拾贝(二)
  18. 基于微信小程序的智能停车场管理系统的研究与设计
  19. 微服务流量卫兵 Sentinel
  20. java date 构造方法_Java Date的概述和构造方法

热门文章

  1. navicat mysql 日志_使用Navicat查看MySQL日志的具体方法
  2. 手机电池(锂电池包)认证要求
  3. SAP TR手动导入系统操作手册
  4. cannot find a java se sdk installed at path_SDK管理器找不到Java
  5. 停止你的周报焦虑!一键生成报表模板的神器来了
  6. windows小技巧1——路径太长导致文件无法删除
  7. 程序员进阶的一些实用工具
  8. jmeter 命令行模式(非GUI)运行脚本,察看结果树结果为空,解决办法;
  9. 数学建模part(2):整数,非线性规划
  10. 通过postgis将shp格式数据导入postgresql数据库