POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang
来源:互联网 发布:a 寻路算法优化 编辑:程序博客网 时间:2024/04/28 03:22
Description
Katu Puzzle is presented as a directed graph G(V, E) 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 ≤ Xi ≤ 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:
AND01000101OR01001111XOR01001110Given 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 a (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 40 1 1 AND1 2 1 OR3 2 0 AND3 0 0 XOR
Sample Output
YES
Hint
#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
- POJ 3678 Katu Puzzle(2-sat)
- POJ 3678 Katu Puzzle(2-SAT)
- POJ 3678 Katu Puzzle(2-SAT)
- POJ 3678 Katu Puzzle (2-SAT)
- poj 3678 Katu Puzzle (2-SAT)
- poj 3678 Katu Puzzle(2-sat)
- POJ 3678 Katu Puzzle (2-SAT)
- POJ 3678 Katu Puzzle(2-SAT判断)
- poj 3678 Katu Puzzle 2-SAT
- 2-sat->poj 3678 Katu Puzzle
- poj 3678 Katu Puzzle (2-sat)
- POJ 3678 Katu Puzzle(2-SAT)
- poj 3678 2-SAT (Katu Puzzle)
- 【POJ】3678 Katu Puzzle 2-sat
- [2-SAT] poj 3678 Katu Puzzle
- POJ 3678 Katu Puzzle(2-sat)
- POJ 3678 Katu Puzzle (2-SAT)
- 利用命令查看端口及对应程序
- 链接器符号解析算法小解以及静态库链接顺序等等问题
- spring依赖注入单元测试:expected single matching bean but found 2
- ExtJs全屏布局
- JSTL解析——004——core标签库03
- POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang
- AutoLayout(自动布局)入门
- 移植rabbitMQ-C
- Android.mk文件语法规范及使用模板
- 剑指Offer 1361 翻转单词顺序
- 20120909
- EGOTableViewPullRefresh动态刷新按钮
- 计算机接入因特网的几种方式
- ubuntu12.04下输入法不能显示