题目大意:给定 N 个点的 M 条约束,约束形式为:\(a_i \lor a_j = 1\)。

题解:拆点什么的就不说了,在求出一组解的时候,考虑到 Tarjan 找环的过程中,scc 染色是按照拓扑序的逆序来进行的,即:拓扑排序中最后被删除的节点的 cor 值最小。根据这个性质,在一定有解的情况下,对于任意一个 \(a_i\),应该取拓扑序大的值(Tarjan 染色小的值)作为最终结果,因为缩点之后的 DAG 上的边依然是选了前一个scc 就必然选与之相连的 scc。

代码如下

  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define all(x) x.begin(),x.end()
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int,int> P;
  8. const int inf=0x3f3f3f3f;
  9. const int maxn=2e6+10;
  10. inline int read(){
  11. int x=0,f=1;char ch;
  12. do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
  13. do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
  14. return f*x;
  15. }
  16. int n,m;
  17. vector<int> G[maxn];
  18. int dfs_clk,dfn[maxn],low[maxn],stk[maxn],top,in[maxn];
  19. int scc,cor[maxn];
  20. void tarjan(int u){
  21. dfn[u]=low[u]=++dfs_clk;
  22. stk[++top]=u,in[u]=1;
  23. for(int i=0;i<G[u].size();i++){
  24. int v=G[u][i];
  25. if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
  26. else if(in[v])low[u]=min(dfn[v],low[u]);
  27. }
  28. if(dfn[u]==low[u]){
  29. ++scc;int v;
  30. do{
  31. v=stk[top--],in[v]=0;
  32. cor[v]=scc;
  33. }while(u!=v);
  34. }
  35. }
  36. void read_and_parse(){
  37. n=read(),m=read();
  38. while(m--){
  39. int i=read(),a=read(),j=read(),b=read();
  40. if(a&&b)G[i].pb(j+n),G[j].pb(i+n);
  41. else if(a&&!b)G[i].pb(j),G[j+n].pb(i+n);
  42. else if(!a&&b)G[i+n].pb(j+n),G[j].pb(i);
  43. else G[i+n].pb(j),G[j+n].pb(i);
  44. }
  45. }
  46. void solve(){
  47. for(int i=1;i<=n<<1;i++)if(!dfn[i])tarjan(i);
  48. for(int i=1;i<=n;i++)if(cor[i]==cor[i+n])return (void)puts("IMPOSSIBLE");
  49. puts("POSSIBLE");
  50. for(int i=1;i<=n;i++)printf("%d ",!(cor[i]<cor[i+n]));
  51. puts("");
  52. }
  53. int main(){
  54. read_and_parse();
  55. solve();
  56. return 0;
  57. }

【模板】2-SAT的更多相关文章

  1. 2 - sat 模板(自用)

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

  2. TwoSAT算法模板

    该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真”  等价于 “Xi为假 –& ...

  3. C++ 模板基础

    我们学习使用C++,肯定都要了解模板这个概念.就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数:进而实现了真正的代码可重用性.模版可 ...

  4. (模板)poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...

  5. 虚拟化技术之kvm镜像模板制作工具virt-sysprep

    virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动:什么是镜像模板呢?所谓模板就是 ...

  6. Jade模板引擎让你飞

    写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...

  7. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  8. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  10. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

随机推荐

  1. jquery 设置cookie、删除cookie、获取cookie

    1.引入jquery.js <script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script> ...

  2. 【gedit】 显示行号

    打开gedit文本编辑器->Edit(编辑)->preferences(预设)->view(视图)->在Display line numbers前打勾->close

  3. DAY05、基本数据类型与内置方法

    一.可变类型与不可变类型: 1.可变类型:值改变,但是id不变 2.不可变类型:值改变,id也改变 二.数据类型: 1.数字类型: 1.1:整型int: 用途:记录年龄.等级.数量 定义方式:age ...

  4. python之if使用方法举例

    if使用方法举例: import random #随机生成1-100的整数 n = random.randint(1, 100) if n > 50: print(n, "> 5 ...

  5. SharePoint Server 2016 - Configure Office Online Server

    Step 1: Create the binding between SharePoint 2016 and Office Web Apps Server   To get started, open ...

  6. C#开发轻松入门--笔记

    第一章 1-1 .NET简介 (02:11) 1-2 Visual Studio简介及安装 (03:23) 1-3 创建C#控制台程序 (04:14) 1-4 练习题 1-5 程序界面各部分介绍 (0 ...

  7. JavaScript知识点总结[部分]

    变量 局部变量必须一个 var 开头,如果未使用var,则默认表示声明的是全局变量. <script type="text/javascript"> // 全局变量 n ...

  8. eolinker——添加项目成员

    https://help.eolinker.com/account/?target=/md/workspace/team 在工作空间的主页面,而不是接口的主页面这个一定要注意,邀请方式有两种,根据自己 ...

  9. centos 7创建ss服务(方式二)

    一:安装pip yum install python-pip 如果没有python包则执行命令:yum -y install epel-release: 二:安装SS pip install shad ...

  10. Android短信大全

    使用ListView实现点击条目跳转短信界面,并将内容传至短信页面: 代码如下:activity_main.xml: <?xml version="1.0" encoding ...