Description:

有n个布尔变量\(x_1\)~\(x_n\),另有m个需要满足的条件,每个条件的形式都是“\(x_i\)为true/false或\(x_j\)为true/false”。比如“\(x_1\)为真或\(x_3\)为假”、“\(x_7\)为假或\(x_2\)为假”。2-SAT 问题的目标是给每个变量赋值使得所有条件得到满足。

Hint:

\(1\le n,m\le 10^6\)

Solution:

模板题,详见代码

  1. #include <algorithm>
  2. #include <cmath>
  3. #include <stack>
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include <iostream>
  7. using namespace std;
  8. const int mxn=2e6+5;
  9. int n,m,tot,cnt,col;
  10. int hd[mxn],bl[mxn],dfn[mxn],low[mxn],ins[mxn];
  11. stack<int > st;
  12. struct ed {
  13. int to,nxt;
  14. }t[mxn<<1];
  15. inline void chkmax(int &x,int y) {if(x<y) x=y;}
  16. inline void chkmin(int &x,int y) {if(x>y) x=y;}
  17. inline void add(int u,int v) {
  18. t[++cnt]=(ed) {v,hd[u]}; hd[u]=cnt;
  19. }
  20. void tj(int u)
  21. {
  22. dfn[u]=low[u]=++tot; st.push(u); ins[u]=1;
  23. for(int i=hd[u];i;i=t[i].nxt) {
  24. int v=t[i].to;
  25. if(!dfn[v]) tj(v),chkmin(low[u],low[v]);
  26. else if(ins[v]) chkmin(low[u],dfn[v]);
  27. }
  28. if(dfn[u]==low[u]) {
  29. ++col;
  30. do{
  31. bl[u]=col; u=st.top();
  32. st.pop(); ins[u]=0;
  33. } while(low[u]!=dfn[u]);
  34. }
  35. } //tarjan基本操作,没什么好说的
  36. int main()
  37. {
  38. scanf("%d%d",&n,&m); int u,v,x,y;
  39. for(int i=1;i<=m;++i) {
  40. scanf("%d%d%d%d",&u,&x,&v,&y);
  41. add(u+n*(x^1),v+n*y);
  42. add(v+n*(y^1),u+n*x); //建边,很好懂的
  43. }
  44. for(int i=1;i<=2*n;++i)
  45. if(!dfn[i]) tj(i);
  46. for(int i=1;i<=n;++i)
  47. if(bl[i]==bl[i+n]) {
  48. puts("IMPOSSIBLE");
  49. return 0;
  50. }
  51. puts("POSSIBLE");
  52. for(int i=1;i<=n;++i)
  53. printf("%d ",bl[i]>bl[i+n]); //按较大拓扑序输出答案
  54. return 0;
  55. }

[模板][P4782]2-SAT的更多相关文章

  1. P4782 【模板】2-SAT 问题 && 2-SAT问题

    2-SAT到图论 \(k-SAT\) 是 k-适应性问题(Satisfiability)的简称. \(k-SAT\) 问题(除 \(k = 2\))已被证明为是 \(NP\) 完全问题, 而对于 \( ...

  2. 洛谷P4782 【模板】2-SAT问题 [2-SAT]

    题目传送门 [模板]2-SAT问题 题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 $x_1/~x_n$​ ,另有$m$个需要满足的条件,每个条件的形式都是“ $x_i$ 为$true/f ...

  3. 2 - sat 模板(自用)

    2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一  POJ 3207 Ikki's Story IV ...

  4. Luogu P4782 【模板】2-SAT 问题(2-SAT)

    P4782 [模板]2-SAT 问题 题意 题目背景 \(2-SAT\)问题模板 题目描述 有\(n\)个布尔变量\(x_1\sim x_n\),另有\(m\)个需要满足的条件,每个条件的形式都是&q ...

  5. P4782 【模板】2-SAT 问题

    https://www.luogu.org/problemnew/show/P4782 链接 https://www.luogu.org/problemnew/show/P4782 思路 选a就必须选 ...

  6. 【刷题】洛谷 P4782 【模板】2-SAT 问题

    题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 \(x_1\)​~\(x_n\)​,另有m个需要满足的条件,每个条件的形式都是"\(x_i\)​为true/false或\(x_j ...

  7. 2-SAT问题介绍求解 + 模板题P4782

    (点击此处查看原题) 什么是2-SAT问题 sat 即 Satisfiability,意思为可满足,那么2-SAT表示一些布尔变量只能取true或者false,而某两个变量之间的值存在一定的关系(如: ...

  8. [洛谷P4782]【模板】2-SAT 问题

    题目大意:有$n$个布尔变量 $x_1 \sim x_n$,另有$m$个需要满足的条件,每个条件的形式都是"$x_i$ 为$true/false$或$x_j$为$true/false$&qu ...

  9. [洛谷P4782] [模板] 2-SAT 问题

    NOIp后第一篇题解. NOIp我考的很凉啊...... 题目传送门 之前讲过怎么判断2-SAT是否存在解. 至于如何构造一组解: 我们想到对tarjan缩点后的图进行拓扑排序. 那么对于代表0状态的 ...

随机推荐

  1. Python自定义-分页器

    Python自定义-分页器 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输入页码(第一页.第二页...) 3 ...

  2. Mongodb for .Net Core 驱动的应用

    一:我在做.net core 应用mongodb的sdk时,查阅了不少资料,故记录下来,以方便查阅.mongodb类库的版本 mongodb driver 2.4.3,一下方法均来自此版本文件 先看看 ...

  3. Storm——Android SQLite数据库管理类库

    Storm是一个Android SQLite数据库管理类库,可以通过注解创建表和迁移数据库.它不是ORM框架.   特性: 1.通过@Annotations创建表: 2.通过@Annotations迁 ...

  4. Kudu的卸载(cdh)

    卸载kudu 1):删除kudu相关包 rm -rf $(find / -name "*kudu*") 2):卸载kudu相关依赖 查询节点的kudu依赖: rpm -qa | g ...

  5. ansible 自动化管理

    1 什么样的情形需要批量部署 1.操作系统的安装 常见的有collber,red hat satelite(redhat)系统专用. 2.操作系统的配置 常见的有cfengine,puppet,che ...

  6. Python 类的内置方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # p ...

  7. k8s 廖老师的分享

    https://mp.weixin.qq.com/s/7o8QxGydMTUe4Q7Tz46Diw

  8. selenium WebDriver 对浏览器标签页的切换

    关于selenium WebDriver 对浏览器标签页的切换,现在的市面上最新的浏览器,当点击一个链接打开一个新的页面都是在浏览器中打开一个标签页,而selenium只能对窗口进行切换的方法,只能操 ...

  9. Codeforces Gym100783H 最短路 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100783H.html 题目传送门 - CF-Gym100783H 题意 给定一个 $n$ 个节点 ...

  10. 如何删除github里面的项目

    第一步 :首先登陆github 第二步:如下图选择 第三步:选择如下图 第四步:点击你要删除的项目,点击settings 第五步:把页面向下拉,找到如图按钮并点击 第六步:需要确认输入你要删除的项目名 ...