题目描述

有n个布尔变量x1~xn,另有m个需要满足的条件,每个条件的形式都是“xi为true/false或xj为true/false”。比如“x1为真或x3为假”、“x7为假或x2为假”。2-SAT 问题的目标是给每个变量赋值使得所有条件得到满足。

输入输出格式

输入格式:

第一行两个整数n和m,意义如体面所述。

接下来m行每行4个整数 i a j b,表示“xi为a或xj为b”(a,b∈{0,1})

输出格式:

如无解,输出“IMPOSSIBLE”(不带引号); 否则输出"POSSIBLE"(不带引号),下 一行n个整数x1~xn(xi∈{0,1}),表示构造出的解。

输入输出样例

输入样例#1:

3 1
1 1 3 0

输出样例#1:
POSSIBLE
0 0 0

思路:2-SAT问题模版题

源代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EnewPosstr 1e-9
#define newPosI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 2000000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;struct Edge{int to,next;
}edge[N*2];
int head[N],tot;
int n,m;
int dfn[N],low[N];
bool vis[N];//标记数组
int scc[N];//记录结点i属于哪个强连通分量
int block_cnt;//时间戳
int sig;//记录强连通分量个数
stack<int> S;
void init(){tot=0;sig=0;block_cnt=0;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(scc,0,sizeof(scc));
}
void addEdge(int from,int to){edge[++tot].to=to;edge[tot].next=head[from];head[from]=tot;
}
void Tarjan(int x) {vis[x]=true;dfn[x]=low[x]=++block_cnt;//每找到一个新点,纪录当前节点的时间戳S.push(x);//当前结点入栈for(int i=head[x]; i!=-1; i=edge[i].next) { //遍历整个栈int y=edge[i].to;//当前结点的下一结点if(!dfn[y]) {Tarjan(y);low[x]=min(low[x],low[y]);}else if(vis[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]) { //满足强连通分量要求sig++;//记录强连通分量个数while(true) { //记录元素属于第几个强连通分量int temp=S.top();S.pop();vis[temp]=false;scc[temp]=sig;if(temp==x)break;}}
}
bool twoSAT(){for(int i=1;i<=2*n;i++)//找强连通分量if(!dfn[i])Tarjan(i);for(int i=1;i<=n;i++)if(scc[i]==scc[i+n])//条件a与!a属于同一连通分量,无解return false;return true;
}
int main() {init();scanf("%d%d",&n,&m);while(m--) {int x,y,xVal,yVal;scanf("%d%d%d%d",&x,&xVal,&y,&yVal);if(xVal==0&&yVal==0){//x为0或y为0addEdge(x+n,y);//x为0,y为1addEdge(y+n,x);//y为0,x为1}else if(xVal==0&&yVal==1){//x为0或y为1addEdge(x+n,y+n);//x为0,y为0addEdge(y,x);//y为1,x为1}else if(xVal==1&&yVal==0){//x为1或y为0addEdge(x,y);//x为1,y为1addEdge(y+n,x+n);//y为0,x为0}else if(xVal==1&&yVal==1){//x为1或y为1addEdge(x,y+n);//x为1,y为0addEdge(y,x+n);//y为1,x为0}}bool flag=twoSAT();if(!flag)printf("IMPOSSIBLE\n");else{printf("POSSIBLE\n");for(int i=1;i<=n;i++){if(scc[i]>scc[i+n])printf("1 ");elseprintf("0 ");}printf("\n");}return 0;
}

2-SAT 问题(洛谷-P4782)相关推荐

  1. 洛谷P4782 2-SAT问题

    2-SAT问题 这是一道2-SAT的模板题.对于2-SAT问题的每一个条件,我们需要把他们转化成可接受的条件.即"若变量A的赋值为x,则变量B的赋值为y",其中x,y均等于0或1. ...

  2. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  3. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  4. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  5. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  6. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  7. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  8. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  9. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. ALSA声卡笔记3--ASoC驱动重要结构体关系图
  2. 无人出租今起免费坐,只恨不是长沙人
  3. java中string类面试题_java中String类的面试题大全含答案
  4. html主要用于组织网页的,HTML网页基本组成概述
  5. mongodb的安装与简单操作
  6. 无法连接Elasticsearch解决方案
  7. localStorage、sessionStorage详解,以及storage事件使用
  8. ISO27000信息安全管理体系
  9. UG二次开发入门--一个简单的示例
  10. 机顶盒及编解码器的音视频质量评价测试
  11. BMFont字体编辑器的使用
  12. 支付宝内部功能调用APP的said说明(转载)
  13. 魅蓝e android无限重启,魅蓝E怎么Root?魅蓝E一键ROOT教程(系统自带Root功能)
  14. 在线透明favicon ico图标文件制作 - aTool在线工具
  15. 先验概率、后验概率、条件概率的形象解释
  16. 高电压超低功耗低压差电压调节器 MST53XXB系列芯片
  17. 数学的Math类总结,方便自己使用,有正余切和一些双曲函数
  18. 鱿鱼游戏玻璃桥文字游戏
  19. NLP-文本摘要:利用预训练模型进行文本摘要任务【transformers:pipeline、T5、BART、Pegasus】
  20. python下载好了怎么用,怎么打开下载好了的python

热门文章

  1. java的property配置文件的用法
  2. LSSS线性秘密共享方案详细构造方法与原理解释试读
  3. JavaEE班第四天
  4. 在张学友演唱会的6万观众中,AI锁定了一名逃犯
  5. STM32之SDIO原理
  6. hive 配置mysql_Hive的mysql安装配置
  7. 凭什么,Netty能成为最流行的NIO框架?
  8. vue-ls vue 本地储存示例
  9. java.lang.IllegalArgumentException: MALFORMED jar解析中文报错问题
  10. 开发指南专题八:JEECG微云快速开发平台数据字典