2-SAT问题学习笔记+例题[洛谷P4792]
一个不错的2-SAT文章:传送门
问题初入
什么是2-SAT
SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性问题,简称 k-SAT。
首先,把「2」和「SAT」拆开。SAT 是 Satisfiability 的缩写,意为可满足性。即一串布尔变量,每个变量只能为真或假。要求对这些变量进行赋值,满足布尔方程。
如何实现2-SAT
一道例题:洛谷P4782 2-SAT例题
首先将每个or的问题转换成假->真问题
然后跑缩点
因为缩点中跑出来的强连通分量的拓扑序已经在过程中求出(虽然是逆序),然后再判断一遍
当 x 所在的强连通分量的拓扑序在 ¬x 所在的强连通分量的拓扑序之后取 x 为真 就可以了。在使用 Tarjan 算法缩点找强连通分量的过程中,已经为每组强连通分量标记好顺序了不过是反着的拓扑序。
上代码
#include<bits/stdc++.h>
#define re register
#define ll long long
using namespace std;
inline int read()
{
	ll k=1,sum=0;
	char c=getchar();
	for(;c<'0' || c>'9';c=getchar()) if(c=='-') k=-1;
	for(;c>='0' && c<='9';c=getchar()) sum=sum*10+c-'0';
	return sum*k;
}
const int N=1e6+10;
int n,m;
struct Edge{
	int to,nxt;
};
int head[N<<1],cnt;
Edge edge[N<<2];
inline void Add(int x,int y){
	edge[++cnt].to=y;edge[cnt].nxt=head[x];head[x]=cnt;
}
int dfn[N<<1],ins[N<<1],color[N<<1],low[N<<1],col;
bool vis[N<<1];
int id;
stack<int> S;
inline void Tarjan(int x){
	S.push(x);
	ins[x]=1;
	dfn[x]=low[x]=++id;
	for(re int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(!dfn[y]){
			Tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(ins[y]) low[x]=min(low[x],low[y]);
	}
	if(low[x]==dfn[x]) {
		re int k=-1;++col;
		while(k!=x){
			k=S.top();S.pop();
			ins[k]=0;
			color[k]=col;
		}
	}
}
int main()
{
	n=read();m=read();
	for(re int k=1;k<=m;++k){
		int i=read(),a=read(),j=read(),b=read();
		Add(i+n*(a&1),j+n*(b^1));
		Add(j+n*(b&1),i+n*(a^1));
	}
	for(re int i=1;i<=n<<1;++i){
		if(!dfn[i]) Tarjan(i);
	}
	for(re int i=1;i<=n;++i)
	if(color[i]==color[i+n]){
		puts("IMPOSSIBLE");
		return 0;
	}
	puts("POSSIBLE");
	for(re int i=1;i<=n;++i) {
		cout<<((color[i]<color[i+n])?1:0)<<" ";
	}
	return 0;
}
												
											2-SAT问题学习笔记+例题[洛谷P4792]的更多相关文章
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
		
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
 - dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
		
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
 - JavaEE精英进阶课学习笔记《博学谷》
		
JavaEE精英进阶课学习笔记<博学谷> 第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准 ...
 - 【算法学习】【洛谷】树链剖分 & P3384 【模板】树链剖分 P2146 软件包管理器
		
刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: ...
 - 【算法学习】【洛谷】cdq分治 & P3810 三维偏序
		
cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...
 - 【做题笔记】洛谷P1506 拯救oibh总部
		
跑一遍染色法,最后判断哪些位置没被染色即可 一些技巧: 为了判断方便,把字符转换成 int 型的数字. 注意边界问题 详细解释见代码 #include <iostream> #includ ...
 - 【做题笔记】洛谷P1036 选数
		
作为一个 DFS 初学者这题真的做得很惨...其实窝学 DFS 一年多了,然后一开始就学不会最近被图论和数据结构打自闭后才准备好好学一学233 一开始,直接套框架,于是就有 #include < ...
 - 【做题笔记】洛谷P1955[NOI2015]程序自动分析
		
第一道蓝题祭- 注意到本题中判断的是下标,即,并不是真的判断 \(i\) 是否等于 \(j\) 显然考虑并查集,把所有标记为"相等"的数放在一个集合里,然后最后扫一遍每个数,如果有 ...
 - 【做题笔记】洛谷P1002过河卒
		
虽说是 dp 入门题,但还是有很多细节需要注意 如果设 \(f_{x,y}\) 为目标地点为 \((x,y)\) 时走的种数,那么答案就是 \(f_{n,m}\) 在不考虑那只讨厌的马的情况下,对于任 ...
 
随机推荐
- (一)ArrayList集合源码解析
			
一.ArrayList的集合特点 问题 结 论 ArrayList是否允许空 允许 ArrayList是否允许重复数据 允许 ArrayList是否有序 有序 ArrayList是否线程安全 ...
 - Golang error 的突围
			
目录 error 的困局 尝试破局 Errors are just values handle not just check errors Only handle errors once 小结 胎死腹 ...
 - .Net基础篇_学习笔记_第四天_switch-case
			
swith-case 用来处理多条件的定值的判断. 语法: switch(变量或者表达式的值) { case 值1:要执行的代码: break: case 值2:要执行的代码: break: case ...
 - centos 7   ifconfig无法找到命令的方法
			
场景:新安装centos 没有安装. centos7.2的mini版没有安装这个东东,所以我们就直接安装就好了,在终端里面输入: yum -y install net-tools
 - Charles 破解版免费下载和注册安装教程
			
本文参考:[Charles 破解版免费下载和注册安装教程](https://www.axihe.com/tools/charles/charles/free-use.html) **软件开发不易,请尽 ...
 - The 10 Most Important Linux Commands/10个最经常使用的命令行
			
1. ls 命令:to show all of the major directiories filed under a given file system. for example: ls /app ...
 - 从Hybrid到React-Native: JS在移动端的南征北战史
			
注:因为不了解Dart,所以本文不对flutter相关内容进行阐述, 实在抱歉 Hybrid Hybird是一种混合开发应用,可以实现JS和Java代码的互通,单纯使用ios/android原生实现, ...
 - 07-SQLServer数据库中的系统数据库
			
一.总结 首先要明确SQLServer的系统数据库一共有5个:Master.Model.Msdb.Tempdb.Resource. 1.Master数据库 (1)master数据库记录了所有系统级别的 ...
 - 在IIS上启用WordPress子域名模式多站点功能
			
昨天负责网站的支持人员向我反馈在我们负责托管网站的WordPress在启动多站点功能后,浏览新站点或访问新站点的"Dashboard"时,都会反馈“404”错误.我检查了WordP ...
 - .net 和 java 技术对应关系
			
.net 和 java 技术对应关系 java 生态的优势早已人尽皆知,asp.net core 的生态也呈欣欣向荣之势.作为高级技术从业人,你不应该落下任何一门技术. 如果你正在将你的 java 知 ...