博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(模板)2-SAT
阅读量:5942 次
发布时间:2019-06-19

本文共 1738 字,大约阅读时间需要 5 分钟。

题目描述

有n个变量,m条语句,没个形如:xi为a或xj为b(a,b=0或1)...

判断是否有解,有的话构造出来一组解

 

 

思路:

  • 将每个变量分为两个点,取0和取1(i和i+n)
  • 对于每条语句可以转换为若xi取(1-a)则xj必须取b,若xj取(1-b)则xi必须取a,按照这样的关系连边
  • 跑一遍tarjan,则在同一个强连通分量中如果取了一个点,那么一定要取其中的其他的点,如果i与i+n在同一个强连通分量,则一定无解
  • 有解时,先缩点,然后每次找到出度为0的点,选取它,并删除即可,这样得到的操作序列就相当于倒着跑一遍拓扑排序(因为拓扑排序是先找入度为0的点)
  • 又注意到tarjan后的col数组其实就是一个自底向上的拓扑序,所以我们每次选出度最小的点就相当于选col小的点

代码:

#include 
#include
#include
#include
#include
#include
using namespace std;#define res register intinline int read(){ int x=0,f=1; char ch; while(!isdigit(ch=getchar())) if(ch=='-') f=-1; while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}const int N=4e6+5,M=4e6+5;int head[N],fron[M],ver[M],nxt[M];int tot,n,m;inline void add(int x,int y){ ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot;}int dfn[N],low[N],col[N],colnum,num;bool ins[N];stack
s;void tarjian(int x){ dfn[x]=low[x]=++num; s.push(x); ins[x]=1; for(res i=head[x],y ; i ; i=nxt[i]) if(!dfn[y=ver[i]]) tarjian(y),low[x]=min(low[x],low[y]); else if(ins[y]) low[x]=min(low[x],dfn[y]); if(dfn[x]==low[x]) { ++colnum; int y; do { y=s.top(); s.pop(); ins[y]=0; col[y]=colnum; }while(x!=y); }}// xi=xj-> yi=yjint opp[N];inline void work(){ for(res i=1 ; i<=n*2 ; ++i) if(!dfn[i]) tarjian(i); for(res i=1 ; i<=n ; ++i) { if(col[i]==col[n+i]) { puts("IMPOSSIBLE"); return; } } puts("POSSIBLE"); for(res i=1 ; i<=n ; ++i) printf("%d ", col[i] > col[i+n]);//col[i]
取0}int main(){ n=read(); m=read(); for(res i=1 ; i<=m ; ++i) { int a=read(),b=read(),c=read(),d=read(); // a=b^1 -> c=d // c=d^1 -> a=b add(a+(b^1)*n,c+d*n); add(c+(d^1)*n,a+b*n); } work(); return 0;}

  

 

转载于:https://www.cnblogs.com/wmq12138/p/10582446.html

你可能感兴趣的文章
Python中常用的内值方法
查看>>
Django重新整理
查看>>
HDU1257题解
查看>>
Iterator
查看>>
Spring MVC整合Velocity
查看>>
fiddler+android抓包工具配置使用
查看>>
Spring Data JPA 复杂/多条件组合分页查询
查看>>
使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)
查看>>
css文本 颜色1
查看>>
面向对象(续)
查看>>
VUE 动态给对象增加属性,并触发视图更新。
查看>>
oracle 分区表
查看>>
字典树--Xor问题
查看>>
Windows 根据进程名杀死进程 kill
查看>>
Eclipse项目启动不了
查看>>
Javascript中的Callback方法浅析
查看>>
HDU1671-Phone List (trie树)
查看>>
Error:java: Compilation failed: internal java compiler
查看>>
笔记。------数组
查看>>
不同数据库中查询前几条记录的用法(SQL Server/Oracle/Postgresql)
查看>>