Description

Katu Puzzle is presented as a directed graph G(VE) with each edge e(a, b) labeled by a boolean operator op (one of AND, OR, XOR) and an integer c (0 ≤ c ≤ 1). One Katu is solvable if one can find each vertex Vi a value Xi (0 ≤ X≤ 1) such that for each edge e(a, b) labeled by op and c, the following formula holds:

Xa op Xb = c

The calculating rules are:

AND 0 1
0 0 0
1 0 1
OR 0 1
0 0 1
1 1 1
XOR 0 1
0 0 1
1 1 0

Given a Katu Puzzle, your task is to determine whether it is solvable.

Input

The first line contains two integers N (1 ≤ N ≤ 1000) and M,(0 ≤ M ≤ 1,000,000) indicating the number of vertices and edges.
The following M lines contain three integers (0 ≤ a < N), b(0 ≤ b < N), c and an operator op each, describing the edges.

Output

Output a line containing "YES" or "NO".

Sample Input

4 4
0 1 1 AND
1 2 1 OR
3 2 0 AND
3 0 0 XOR

Sample Output

YES

Hint

X0 = 1, X1 = 1, X2 = 0, X3 = 1.
       题目大意:有 n 个变量和m个条件,每个条件格式如下:
       给你三个数a , b , c 和一个运算字符串op (AND , OR , XOR 等), 要求Xa op Xb = c 。
       问:是否能给每个变量赋值(0 或 1),使得每个条件都能满足?
       解题思路:这道题是一道2 - SAT问题的变形,2 - SAT 问题中是通过条件建立图中的边 ,这道题也类似,也是也要通过条件建立 相应的 边,只不过有些细节需要注意。
       请看代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdio>
#include<queue>
#define mem(a , b) memset(a , b , sizeof(a))
using namespace std ;
const int MAXN = 10000 ;
vector<int> G[MAXN * 2] ;
bool mark[MAXN * 2] ;
int S[MAXN] , c ; // 模拟栈
char op[8] ;
int n , m ;
int pan ; // 判断标志
void chu()
{
int i ;
for(i = 0 ; i < n * 2 ; i ++)
G[i].clear() ;
mem(mark , 0) ;
}
void init()
{
chu() ;
pan = 0 ;
int i ;
for(i = 0 ; i < m ; i ++)
{
int a , b , c ;
scanf("%d%d%d" , &a , &b , &c) ;
scanf("%s" , op) ;
if(op[0] == 'A')
{
if(c == 1) // 注意此时建边的方式
{
G[2 * a].push_back(2 * a + 1) ;
G[2 * b].push_back(2 * b + 1) ; }
else
{
G[2 * a + 1].push_back(2 * b) ;
G[2 * b + 1].push_back(2 * a) ;
}
}
else if(op[0] == 'X')
{
if(c == 0)
{
G[2 * a].push_back(2 * b) ;
G[2 * a + 1].push_back(2 * b + 1) ;
G[2 * b].push_back(2 * a) ;
G[2 * b + 1].push_back(2 * a + 1) ;
}
else
{
G[2 * a].push_back(2 * b + 1) ;
G[2 * a + 1].push_back(2 * b) ;
G[2 * b].push_back(2 * a + 1) ;
G[2 * b + 1].push_back(2 * a) ;
}
}
else
{
if(c == 0) // 注意此时建边的方式
{
G[2 * a + 1].push_back(2 * a) ;
G[2 * b + 1].push_back(2 * b) ;
}
else
{
G[2 * a].push_back(2 * b + 1) ;
G[2 * b].push_back(2 * a + 1) ;
}
}
}
}
bool dfs(int x)
{
if(mark[x ^ 1]) return false ;
if(mark[x]) return true ;
mark[x] = true ;
S[c ++] = x ;
int i ;
for(i = 0 ; i < G[x].size() ; i ++)
{
if(!dfs(G[x][i]))
return false ;
}
return true ;
}
void solve()
{
if(pan)
puts("NO") ;
else
{
int i ;
for(i = 0 ; i < n ; i ++)
{
if(!mark[i * 2] && !mark[i * 2 + 1])
{
c = 0 ;
if(!dfs(i * 2))
{
while (c > 0)
{
mark[ S[-- c] ] = false ;
}
if(!dfs(i * 2 + 1))
{
pan = 1 ;
break ;
}
}
}
}
if(pan)
puts("NO") ;
else
puts("YES") ;
}
}
int main()
{
while (scanf("%d%d" , &n , &m) != EOF)
{
init() ;
solve() ;
}
return 0 ;
}

POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang的更多相关文章

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

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

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

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

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

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

  4. POJ 3678 Katu Puzzle (2-SAT)

                                                                         Katu Puzzle Time Limit: 1000MS ...

  5. POJ 3678 Katu Puzzle (2-SAT,常规)

    题意:给出n个点,每个点上有一个数字可以0或1,然后给出m条限制,要求a和b两个点上的数字满足 a op b = c,op和c都是给定.问是否能够有一组解满足所有限制?(即点上的数字是0是1由你决定) ...

  6. 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 ...

  7. 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 ...

  8. POJ 1135 Domino Effect (spfa + 枚举)- from lanshui_Yang

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  9. poj 3678 Katu Puzzle(Two Sat)

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

随机推荐

  1. XMind快捷键可以自定义吗

    在使用快捷键的时候,不知你是否有过这样的疑问,为什么这个操作的快捷键一定要是这个呢,我为什么不能换成其他的按键呢.其实这些在XMind思维导图中都是可以更改的,用户可以根据自己的操作习惯来定义快捷键命 ...

  2. Android学习总结——实现Home键功能

    实现Home键功能简而言之就是回到桌面,让Activity不销毁,程序后台运行. 实现方法: Intent intent= new Intent(Intent.ACTION_MAIN); intent ...

  3. MySQL搜索: WHERE 多条件

    WHERE能够按多条件进行搜索. products表例如以下: a WHERE后以and 接两个条件以及三个条件进行搜索: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  4. Linux以及Android开发中的小技巧和长繁命令记录收集

    不断更新收集中.... 201407161654 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080port建立 ...

  5. python 笔记1--基础类型

    list 操作 append() 添加最外面 insert(pos,content) 插入指定地方 pop() 删除最外面 pop(pos) 删除指定地方 list中可以有list,且能用二维数组的方 ...

  6. EF查询数据库框架的搭建

    一个简单的EF查询框架除了运行项目外,大概需要5个类库项目,当然这个不是一定要这样做,这可以根据自己的需要设置有多少个项目.这里介绍的方法步骤只适合EF零基础的人看看就是了. 在开始之前,先建立一个运 ...

  7. Struts2 实战经验 之 入门

    Struts2以WebWork为核心,采用拦截器机制处理用户请求,这样的设计使业务逻辑控制器能够与Servlet API完全脱离开,降低了藕联性. Part 1. 安装与配置 下载struts-2.3 ...

  8. JavaMail发送简单邮件

    非常简单的发送邮件实现,网上有很多啦,但还是自己写写记录下吧. package cn.jmail.test; import java.util.Properties; import javax.mai ...

  9. 安装weblogic的步骤10.3.0.0

    一.安装前的注意事项: weblogic在安装前必须要有对应的jdk支持weblogic的运行.所以在安装之前一定要根据本机上安装的jdk来选择安装的weblgoic的什么版本.因为weblogic的 ...

  10. 切记ajax中要带上AntiForgeryToken防止CSRF攻击

    在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起 ...