poj 3678 (2-SAT)
2014-01-22 12:35
369 查看
题意:给定一些变量告诉你他们之间的表达式包括其中的and or xor 然后让你计算是不是有满足的解。
思路:典型的2—SAT问题,首先我是把所有的逻辑表达式化简成->表示然后再a->b之间建立一条边。接着套模版就OK了。
代码如下:
View Code
思路:典型的2—SAT问题,首先我是把所有的逻辑表达式化简成->表示然后再a->b之间建立一条边。接着套模版就OK了。
代码如下:
//2014-01-21-14.47 //2-SAT #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <queue> #include <stack> #include <vector> #define MP(a, b) make_pair(a, b) #define PB(a) push_back(a) using namespace std; typedef long long ll; typedef pair<int ,int> pii; typedef pair<unsigned int, unsigned int> puu; typedef pair<int ,double> pid; typedef pair<ll, int> pli; const int INF = 0x3f3f3f3f; const double eps = 1e-6; const int LEN = 1010; vector<int> Map[LEN]; bool mark[LEN*2]; int S[LEN*2], c; bool dfs(int x) { if(mark[x^1]) return false; if(mark[x]) return true; mark[x] = true; S[c++] = x; for(int i=0; i<Map[x].size(); i++) if(!dfs(Map[x][i])) return false; return true; } void init(int n){ for(int i=0; i<n*2; i++)Map[i].clear(); memset(mark, 0, sizeof mark); } void add_clause(int x, int xval, int y, int yval) { x = x*2 + xval; y = y*2 + yval; Map[x].PB(y); } bool solve(int n){ for(int i=0; i<n*2; i+=2) if(!mark[i] && !mark[i+1]){ c = 0; if(!dfs(i)) { while(c > 0) mark[S[--c]] = false; if(!dfs(i+1)) return false; } } return true; } int main() { // freopen("in.txt", "r", stdin); int n, m, a, b, res; char op[11]; while(scanf("%d%d", &n, &m)!=EOF){ init(n); for(int i=0; i<m; i++){ scanf("%d%d%d%s", &a, &b, &res, op); if(!strcmp(op, "AND") && res) { add_clause(a, 0, a, 1); add_clause(b, 0, b, 1); }else if(!strcmp(op, "AND") && !res){ add_clause(a, 1, b, 0); add_clause(b, 1, a, 0); }else if(!strcmp(op, "XOR") && res){ add_clause(a, 0, b, 1); add_clause(a, 1, b, 0); add_clause(b, 0, a, 1); add_clause(b, 1, a, 0); }else if(!strcmp(op, "XOR") && !res){ add_clause(a, 0, b, 0); add_clause(a, 1, b, 1); add_clause(b, 0, a, 0); add_clause(b, 1, a, 1); }else if(!strcmp(op, "OR") && res){ add_clause(a, 0, b, 1); add_clause(b, 0, a, 1); }else { add_clause(a, 1, a, 0); add_clause(b, 1, b, 0); } } if(solve(n)) printf("YES\n"); else printf("NO\n"); } return 0; }
View Code
相关文章推荐
- poj 3678 2-SAT问题
- Poj 3678 Katu Puzzle【2-SAT----Tarjan强连通】
- poj 3678 2-sat(强连通)
- POJ 3678 Katu Puzzle【2-SAT】
- POJ 3678 Katu Puzzle (2-SAT,常规)
- POJ 3678 Katu Puzzle(2-SAT)
- poj 3678 2-sat
- POJ 3678 Katu Puzzle(POJ 六道2-SAT之一)
- [poj 3678]Katu Pazzle[2-SAT常用建图法]
- POJ 3678 Katu Puzzle (2-sat基础)
- POJ 3678 Katu Puzzle(POJ 六道2-SAT之一)
- POJ 3678 - Katu Puzzle(2-SAT)
- POJ 3678 2-sat,基础题
- |poj 3678|2-SAT|Katu Puzzle
- POJ 3678 2-sat
- 2-sat POJ 3678
- POJ 3678 深刻理解2SAT
- POJ 3678 Katu Puzzle(2-sat)
- POJ 3678 Katu Puzzle 2-SAT
- POJ_3678 Katu Puzzle 2-sat