POJ3678_Katu Puzzle_2-sat
2018-01-18 19:46
162 查看
题意
给出 n 个未知数, m 个布尔方程组成的方程组,判断输出是否有解。思路
把式子转化成蕴含式,套用2-sat即可。要注意的一点是: a 与 b = !a -> a 与 !b -> b
链接
http://poj.org/problem?id=3678代码
#include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; const int maxn = 1000 + 10; const int maxv = maxn << 1; int n, m, v; int a, b, c; char op[10]; vector<int> vs; bool G[maxv][maxv], rG[maxv][maxv], vis[maxv]; int cmp[maxv]; void add(int a, int b){ G[a][b] = rG[b][a] = true; } void read(){ scanf("%d %d", &n, &m); v = n << 1; for(int i = 0; i < m; ++i){ scanf("%d %d %d %s", &a, &b, &c, &op); if(op[0] == 'A'){ if(c == 1){add(a + n, a);add(b + n, b);} else{add(a, b + n);add(b, a + n);}; }else if(op[0] == 'O'){ if(c == 1){add(a + n, b);add(b + n, a);} else{add(a, a + n);add(b, b + n);} }else{ if(c == 1){add(a, b + n);add(b, a + n);add(a + n, b);add(b + n, a);} else{add(a, b);add(b + n, a + n);add(a + n, b + n);add(b, a);} } } } void dfs(int x){ vis[x] = true; for(int i = 0; i < v; ++i){ if(G[x][i] && !vis[i]) dfs(i); } vs.push_back(x); } void rdfs(int x, int k){ vis[x] = true; cmp[x] = k; for(int i = 0; i < v; ++i){ if(rG[x][i] && !vis[i]) rdfs(i, k); } } int scc(){ memset(vis, false, sizeof vis); for(int i = 0; i < v; ++i){ if(!vis[i]) dfs(i); } int k = 0; memset(vis, false, sizeof vis); for(int i = vs.size()-1; i >= 0; --i){ if(!vis[vs[i]]) rdfs(vs[i], k++); } return k; } bool solve(){ scc(); for(int i = 0; i < n; ++i){ if(cmp[i] == cmp[i+n]) return false; } return true; } int main(){ read(); if(solve()) puts("YES"); 839e else puts("NO"); return 0; }
相关文章推荐
- POJ3678 Katu Puzzle【2-SAT】
- [POJ3678]Katu Puzzle(2-SAT)
- POJ3678 Katu Puzzle(2-sat tanjar判矛盾)
- POJ3678:Katu Puzzle 2-SAT
- POJ3678 Katu Puzzle 【2-sat】
- 【2-SAT】POJ3678-Katu Puzzle
- [POJ3678]Katu Puzzle(2-SAT)
- poj3678 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)
- pku3678 Katu Puzzle 2-sat判断是否存在可行解
- POJ 3678 Katu Puzzle(POJ 六道2-SAT之一)
- POJ 3678 Katu Puzzle(2-SAT)
- POJ 3678 Katu Puzzle(2-sat)