Description

给出一个关系,包括 And,Xor,Or 问是否存在解.

Sol

经典的2-SAT问题.

把每个值看成两个点,一个点代表选 \(0\) ,另一个代表选 \(1\) .

首先来看 Xor :

如果两个值异或起来为 \(1\) :那么连边 \((i_0,j_1),(i_1,j_0),(j_0,i_1),(j_1,i_0)\) .

否则 连边 \((i_0,j_0),(i_1,j_1),(j_0,i_0),(j_1,i_1)\) .

然后是 And.

如果两个值 And 起来为 \(1\) :连边 \((i_0,i_1),(j_0,j_1)\)

否则 连边 \((i_1,j_0),(j_1,i_0)\)

最后是 Or.

如果两个值 Or 起来为 \(1\) :连边 \((i_0,j_1),(j_1,i_0)\)

否则 连边 \((i_1,i_0),(j_1,j_0)\) .

Tarjan 缩一下环判断一下两个点是否在一个环中就可以了.

Code

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std; const int N = 2005; int n,m,cnt,cntb;
vector< int > g[N];
int d[N],b[N],ins[N];
int stk[N],top; inline int in(int x=0,char ch=getchar()){ while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; }
void Add_Edge(int fr,int to) { g[fr].push_back(to); }
void Tarjan(int u,int fa) {
int dfsn=++cnt;d[u]=cnt,ins[u]=1,stk[++top]=u;
for(int i=0,v;i<(int)g[u].size();i++) {
v=g[u][i];
if(!d[v]) Tarjan(v,u);
if(ins[v]) d[u]=min(d[u],d[v]);
}if(dfsn==d[u]) {
for(++cntb;stk[top]!=u;top--) {
b[stk[top]]=cntb,ins[stk[top]]=0;
}ins[stk[top]]=0,b[stk[top--]]=cntb;
}
// cout<<u<<":"<<dfsn<<" "<<d[u]<<endl;
}
int main() {
// freopen("in.in","r",stdin);
n=in(),m=in();
char opt[50];
for(int i=1;i<=m;i++) {
int u=in(),v=in(),w=in();
scanf("%s",opt);
if(u>v) swap(u,v);
if(opt[0]=='X') {
if(w) {
Add_Edge(u*2,v*2+1);
Add_Edge(u*2+1,v*2);
Add_Edge(v*2,u*2+1);
Add_Edge(v*2+1,u*2);
}else {
Add_Edge(u*2,v*2);
Add_Edge(v*2,u*2);
Add_Edge(u*2+1,v*2+1);
Add_Edge(v*2+1,u*2+1);
}
}else if(opt[0]=='A') {
if(w) {
Add_Edge(u*2,u*2+1);
Add_Edge(v*2,v*2+1);
}else {
Add_Edge(u*2+1,v*2);
Add_Edge(v*2+1,u*2);
}
}else {
if(w) {
Add_Edge(u*2,v*2+1);
Add_Edge(v*2,u*2+1);
}else {
Add_Edge(u*2+1,u*2);
Add_Edge(v*2+1,v*2);
}
}
}
for(int i=0;i<2*n;i++) if(!d[i]) Tarjan(i,i);
// for(int i=0;i<2*n;i++) cout<<b[i]<<" ";cout<<endl;
for(int i=0;i<2*n;i++) if(b[i]==b[i^1]) return puts("NO"),0;
return puts("YES"),0;
}

  

POJ 3678 Katu Puzzle的更多相关文章

  1. POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9987   Accepted: 3741 Descr ...

  2. poj 3678 Katu Puzzle(2-sat)

    Description Katu Puzzle ≤ c ≤ ). One Katu ≤ Xi ≤ ) such that for each edge e(a, b) labeled by op and ...

  3. POJ 3678 Katu Puzzle (经典2-Sat)

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6553   Accepted: 2401 Descr ...

  4. POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  5. POJ 3678 Katu Puzzle (2-SAT)

                                                                         Katu Puzzle Time Limit: 1000MS ...

  6. poj 3678 Katu Puzzle 2-SAT 建图入门

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  7. poj 3678 Katu Puzzle(Two Sat)

    题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...

  8. POJ 3678 Katu Puzzle 2-SAT 强连通分量 tarjan

    http://poj.org/problem?id=3678 给m条连接两个点的边,每条边有一个权值0或1,有一个运算方式and.or或xor,要求和这条边相连的两个点经过边上的运算后的结果是边的权值 ...

  9. POJ 3678 Katu Puzzle(强连通 法)

    题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...

随机推荐

  1. [No000068]document.body.clientHeight 和 document.documentElement.clientHeight 的区别

    document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...

  2. MySQL的基本知识 -- 命令

    1.数据库和表 SHOW DATABASES; 返回可用数据库的一个列表 SHOW TABLES; 返回一个数据库内的表的列表 SHOW COLUMNS FROM tableName; 返回数据表的表 ...

  3. SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片

    为了保持通讯信息的一致性,需要设置SharePoint,Exchange, Lync等信息同步更新显示,例如,员工头像信息. 本文介绍如何在SharePoint 2013中同步显示Active Dir ...

  4. FineUI小技巧(7)多表头表格导出

    前言 之前我们曾写过一篇文章 FineUI小技巧(3)表格导出与文件下载,对于在 FineUI 中导出表格数据进行了详细描述.今天我们要更进一步,介绍下如何导出多表头表格. 多表头表格的标签定义 在 ...

  5. [转]iostat命令详解

    iostat iostat用于输出CPU和磁盘I/O相关的统计信息.  命令格式: iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ devi ...

  6. JavaScript模板引擎artTemplate.js——为什么使用模板引擎?

    作为一个工作一年的菜鸟,在公司做了几个外包项目,也接触到了不同形式的web开发.其实也没多少,就是javaweb开发和HTML5移动开发,这两者在页面展示的时候的解决方案还是有所不同的. 1.vo+e ...

  7. php特殊用法

    1.将字符串转换成可执行的php代码(简单的代码)--eval() <?php $str="echo phpinfo();"; echo eval( $str);

  8. JVM_垃圾回收串行、并行、并发算法(总结)

    一.串行 JDK1.5前的默认算法 缺点是只有一个线程,执行垃圾回收时程序停止的时间比较长 语法 -XX:+UseSerialGC 新生代.老年代使用串行回收 新生代复制算法 老年代标记-压缩 示例图 ...

  9. offsetHeight, clientHeight与scrollHeight的区别

      在网上搜了一下,结论非常笼统,讲IE从不讲版本,因此自己做了测试并上传结论.以下结论皆是在标准模式下测试通过的,没有测试quirk模式. clientHeight 大部分浏览器对 clientHe ...

  10. thinkphp __PUBLIC__的定义 __ROOT__等常量的定义

    2 3 4 5 6 7 8 9 '__TMPL__'      =>  APP_TMPL_PATH,  // 项目模板目录 '__ROOT__'      =>  __ROOT__,    ...