【模板】2-SAT
题目大意:给定 N 个点的 M 条约束,约束形式为:\(a_i \lor a_j = 1\)。
题解:拆点什么的就不说了,在求出一组解的时候,考虑到 Tarjan 找环的过程中,scc 染色是按照拓扑序的逆序来进行的,即:拓扑排序中最后被删除的节点的 cor 值最小。根据这个性质,在一定有解的情况下,对于任意一个 \(a_i\),应该取拓扑序大的值(Tarjan 染色小的值)作为最终结果,因为缩点之后的 DAG 上的边依然是选了前一个scc 就必然选与之相连的 scc。
代码如下
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int inf=0x3f3f3f3f;
const int maxn=2e6+10;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
int n,m;
vector<int> G[maxn];
int dfs_clk,dfn[maxn],low[maxn],stk[maxn],top,in[maxn];
int scc,cor[maxn];
void tarjan(int u){
dfn[u]=low[u]=++dfs_clk;
stk[++top]=u,in[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
else if(in[v])low[u]=min(dfn[v],low[u]);
}
if(dfn[u]==low[u]){
++scc;int v;
do{
v=stk[top--],in[v]=0;
cor[v]=scc;
}while(u!=v);
}
}
void read_and_parse(){
n=read(),m=read();
while(m--){
int i=read(),a=read(),j=read(),b=read();
if(a&&b)G[i].pb(j+n),G[j].pb(i+n);
else if(a&&!b)G[i].pb(j),G[j+n].pb(i+n);
else if(!a&&b)G[i+n].pb(j+n),G[j].pb(i);
else G[i+n].pb(j),G[j+n].pb(i);
}
}
void solve(){
for(int i=1;i<=n<<1;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)if(cor[i]==cor[i+n])return (void)puts("IMPOSSIBLE");
puts("POSSIBLE");
for(int i=1;i<=n;i++)printf("%d ",!(cor[i]<cor[i+n]));
puts("");
}
int main(){
read_and_parse();
solve();
return 0;
}
【模板】2-SAT的更多相关文章
- 2 - sat 模板(自用)
2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一 POJ 3207 Ikki's Story IV ...
- TwoSAT算法模板
该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真” 等价于 “Xi为假 –& ...
- C++ 模板基础
我们学习使用C++,肯定都要了解模板这个概念.就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数:进而实现了真正的代码可重用性.模版可 ...
- (模板)poj2947(高斯消元法解同余方程组)
题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...
- 虚拟化技术之kvm镜像模板制作工具virt-sysprep
virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动:什么是镜像模板呢?所谓模板就是 ...
- Jade模板引擎让你飞
写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
随机推荐
- java连接CentOS7上的redis
这篇博客写得挺全的: https://blog.csdn.net/achenyuan/article/details/78521831?locationNum=3&fps=1 我也是跟着这篇博 ...
- Vue 刷新当前页面,并重新加载页面数据
业务场景:在管理后台,在执行完,增,删,改,操作的时候.我们需要刷新一下页面,重载数据.在JQ中我们会用到location.reload()方法,刷新页面:在vue中,这里需要用到一个 provide ...
- jquery选择基础
1 元素选择器 之前不熟悉的是如: $("input.cls1"); 这种用法 2 属性选择器 包含name属性的input元素, 如 $("input[name]&qu ...
- 一个加载时带动画效果的ListBoxItem
今天我们来谈一下ListBoxItem这个控件,ListBoxItem是直接从ContentControl继承而来的,所以可以添加到任何具有Content属性的控件中去,常见的ListBoxItem可 ...
- PLSQL 汉化
自动导入PLSQL安装目录: 一直下一步就可以了: 之后重新打开:
- Python包的相对导入时出现问题解决
资料参考: https://www.cnblogs.com/ArsenalfanInECNU/p/5346751.html 在python导入包,如下: from .units import * 经常 ...
- sql查询表中重复数据个数
select train_code,count(1) from tb_ask_trainbodyroadtrain group by train_code having count(1) >1
- 使用Windows任务计划程序运行Windows PowerShell脚本
创建计划任务以运行PowerShell脚本 我需要创建一个计划任务来运行Windows PowerShell脚本的第一件事是我将执行的命令行.找到这个的简单方法是使用Run 命令.有时,我需要知道什么 ...
- yum的使用与配置
yum简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的开发者 ...
- docker 搭建简易仓库registry
下载仓库镜像: docker pull registry:2 运行仓库库镜像: docker run -d -p 5000:5000 -v /usr/local/registry:/var/li ...