洛谷P4782 【模板】2-SAT问题 [2-SAT]
【模板】2-SAT问题
题目背景
2-SAT 问题 模板
题目描述
有n个布尔变量 $x_1/~x_n$ ,另有$m$个需要满足的条件,每个条件的形式都是“ $x_i$ 为$true/false$或 $x_j$ 为$true/false$”。比如“ $x_1$ 为真或 $x_3$ 为假”、“ $x_7$ 为假或 $x_2$ 为假”。$2-SAT$ 问题的目标是给每个变量赋值使得所有条件得到满足。
输入输出格式
输入格式:
第一行两个整数$n$和$m$,意义如体面所述。
接下来$m$行每行$4$个整数 $i a j b$,表示“ $x_i$ 为$a$或 $x_j$ 为$b$”($a,b\in {0,1}$)
输出格式:
如无解,输出“IMPOSSIBLE”(不带引号); 否则输出"POSSIBLE"(不带引号),下 一行n个整数 $x_1$ ~ $x_n$ ( $x_i\in {0,1}$),表示构造出的解。
输入输出样例
3 1
1 1 3 0
POSSIBLE
0 0 0
说明
1<=n,m<=1e6 , 前3个点卡小错误,后面5个点卡效率,由于数据随机生成,可能会含有( 10 0 10 0)之类的坑
分析:
$2-SAT$模板题,特地练下手。
经典的$2-SAT$模型就不多说了,需要注意的是每次建图时要注意点之间的关系,一旦关系多起来就容易建图建错。(好吧其实是我自己建图建错了两次233333)
Code:
//It is made by HolseLee on 21st Aug 2018
//Luogu.org P4782
#include<bits/stdc++.h>
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std; const int N=1e6+;
int n,m,bel[N<<],scc,idx,dfn[N<<],low[N<<];
bool vis[N<<];
vector<int>e[N<<];
stack<int>sta; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline void tarjan(int u)
{
dfn[u]=low[u]=++idx;
sta.push(u);vis[u]=true;
int v;
for(int i=;i<e[u].size();++i){
v=e[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=Min(low[u],low[v]);
}else if(vis[v]){
low[u]=Min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
scc++;
do{
v=sta.top();sta.pop();
vis[v]=false;bel[v]=scc;
}while(v!=u);
}
} int main()
{
n=read();m=read();
int a,b,x,y;
for(int i=;i<=m;++i){
a=read(),x=read(),b=read(),y=read();
e[a+(x^)*n].push_back(b+y*n);
e[b+(y^)*n].push_back(a+x*n);
}
for(int i=;i<=(n<<);++i)
if(!dfn[i])tarjan(i);
for(int i=;i<=n;++i)
if(bel[i]==bel[i+n]){
printf("IMPOSSIBLE\n");
return ;
}
printf("POSSIBLE\n");
for(int i=;i<=n;++i){
printf("%d ",(bel[i]>bel[i+n]));
}
return ;
}
洛谷P4782 【模板】2-SAT问题 [2-SAT]的更多相关文章
- [洛谷P4782] [模板] 2-SAT 问题
NOIp后第一篇题解. NOIp我考的很凉啊...... 题目传送门 之前讲过怎么判断2-SAT是否存在解. 至于如何构造一组解: 我们想到对tarjan缩点后的图进行拓扑排序. 那么对于代表0状态的 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
随机推荐
- jquery validate 二选一,错误提示在一处
转载自:http://blog.51yip.com/jsjquery/1483.html 有一同事对jquery validate这个插件不熟,实现多处报错信息在一处,并且还有二选一的情况,二个输入框 ...
- SpringCloud学习(5)——Feign负载均衡
Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. ...
- ACM-ICPC2018 青岛赛区网络预赛-B- Red Black Tree
题目描述 BaoBao has just found a rooted tree with n vertices and (n-1) weighted edges in his backyard. A ...
- 2017 ACM-ICPC 西安网络赛 F.Trig Function Chebyshev多项式
自己太菜,数学基础太差,这场比赛做的很糟糕.本来想吐槽出题人怎么都出很数学的题,现在回过头来想还是因为自己太垃圾,竞赛就是要多了解点东西. 找$f(cos(x))=cos(nx)$中$x^m$的系数模 ...
- MongoDB - MongoDB CRUD Operations, Query Documents, Query for Null or Missing Fields
Different query operators in MongoDB treat null values differently. The examples on this page use th ...
- 30款基于 jQuery & CSS3 的加载动画和进度条插件
我们所生活每一天看到的新技术或新设计潮流的兴起,Web 开发正处在上升的时代.HTML5 & CSS3 技术的发展让 Web 端可以实现的功能越来越强大. 加载动画和进度条使网站更具吸引力.该 ...
- 【CodeForces】671 B. Robin Hood
[题目]B. Robin Hood [题意]给定n个数字的序列和k次操作,每次将序列中最大的数-1,然后将序列中最小的数+1,求最终序列极差.n<=5*10^5,0<=k<=10^9 ...
- 2-Python基础语法-内存管理-运算符-程序控制
目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...
- Linux下用到数据库sqlite3
最近在Linux下用到数据库sqlite3,于是开始了该方面的学习. 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库.创建 ...
- html的loadrunner脚本
Action(){ char strs[20]; lr_start_transaction("api_sync_order"); web_add_header("SO ...