2-SAT(随意写点)
今年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(随意写点)相关推荐
- 模板 - 2 - SAT问题
整理的算法模板合集: ACM模板 注意一个坑,2SAT问题中如果要求你输出方案,如果你的代码输出的跟样例不一样,不要着急,因为2SAT 问题本来就是有多解,结果我样例不过,交上去就A了 方案输出时,c ...
- 计算机学院 图论方向,成电计算机学院本科生在计算机科学理论方向重要国际会议SAT上发表论文...
近日,计算机科学与工程学院(网络空间安全学院)2017级本科生和肖鸣宇教授撰写的论文"A Fast Algorithm for SAT in Terms of Formula Length& ...
- MIT录取不再看SAT科目成绩:曾是华裔传统优势,数学等学科测验更是中国留学生强项...
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 美国麻省理工学院今天在招生网站上宣布,决定不再考虑将SAT科目考试作为录取过程的一部分. 这一决定从2020~2021学年开始生效. SA ...
- 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?
加州大学欧文分校对于SAT成绩的要求是多少?现在申请美国本科,很多都是需要同学们提供sat成绩的额,下面托普仕留学老师为大家介绍SAT多少分才能申请加州大学欧文分校?同学们在申请之前要多注意院校信息. ...
- 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求
下面为大家介绍的是加州大学欧文分校University of California Irvine的SAT成绩要求.加州大学欧文分校University of California Irvine是美国加 ...
- 如何使用SAP事务码SAT进行UI应用的性能分析
Sent: Wednesday, July 11, 2012 7:49 PM Subject: [Knowledge share]How to trace UI transaction using S ...
- 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
今天是农历鼠年大年初四,本文是鼠年第4篇文章,也是汪子熙公众号第203篇原创文章. 大家这几天在家里宅得如何了?貌似不少朋友都闷坏了. 我们继续学习. Jerry之前的文章 SAP错误消息调试之七种武 ...
- 使用ABAP SAT工具分析SAP OData service实现明细
Created by Wang, Jerry, last modified on Mar 26, 2015 使用SAT运行OData service测试report: 直接运行report: 确保OD ...
- 使用SAT研究IBASE hierarchy读取性能
Created by Jerry Wang on Mar 06, 2014 1. transaction code SAT,创建一个新的variant例如ZJERRY, 确保Aggregation为N ...
- 如何使用SAT trace一个正在运行的程序
Created by Jerry Wang, last modified on Jul 17, 2014 在SAT tcode中维护需要使用的SAT variant,在这个例子里为ZJERRY.在ta ...
最新文章
- 人工智能芯片支持超低功耗器件的推理
- 基础002. Editplus编辑远程文件
- Linux负载均衡软件LVS
- python编程在哪里写-python3.6.3 安装好了在哪里编写程序
- http各种中的各种timeout
- LeetCode题库第888题 公平的糖果棒交换
- QT中IDirect3DDevice9的Present方法失败情况的处理笔记
- 分享自己写的一个贪吃蛇的游戏(Linux)
- javascript基础系列:DOM相关的技术知识点
- 【Tomcat】Tomcat Connector的三种运行模式【bio、nio、apr】
- Windows Phone 8初学者开发—第18部分:在页面间导航
- Javascript:js借助jQuery和fileSave将表格存储到world
- 年终工作总结汇报和述职报告ppt模板,内含范文可参考,精选20套可下载
- 坐标变换(1)—向量和坐标系
- JVM如何读GC日志以及如何使用工具分析
- Windows系统基础配置
- 武汉代茜2017级计算机科学与技术,毕业论文致谢拾贝(二)
- 基于微信小程序的智能停车场管理系统的研究与设计
- 微服务流量卫兵 Sentinel
- java date 构造方法_Java Date的概述和构造方法