POJ 3678 Katu Puzzle 2-sat简单题
2016-10-18 12:03
399 查看
题目:
http://poj.org/problem?id=3678题意:
给定一个有向图,每条边有一个操作符(AND || OR || XOR)和一个值(0或1),问能不能给每个点赋值(0或1),使得任一条边连接的两个点的值通过边上的运算符得到的值等于边上的值思路:
明显的2-sat题目AND 当c=0时,连边(a,~b)(b,~a);当c=1时,连边(a,b)(b,a)(~a,a)(~b,b)
OR 当c=0时,连边(~a,~b)(~b,~a)(a,~a)(b,~b);当c=1时,连边(~a,b)(~b,a)
XOR 当c=0时,连边(a,b)(b,a)(~a,~b)(~b,~a);当c=1时,连边(a,~b)(b,~a)(~a,b)(~b,a)
最后检查一下相反的两项有没有在一个强连通分量内即可
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 2010; struct edge { int to, next; }g[N*N]; int cnt, head ; int num, idx, top, scc , st , dfn , low ; bool vis ; int n, m; void add_edge(int v, int u) { g[cnt].to = u, g[cnt].next = head[v], head[v] = cnt++; } void init() { memset(head, -1, sizeof head); memset(dfn, -1, sizeof dfn); memset(vis, 0, sizeof vis); cnt = num = idx = top = 0; } void tarjan(int v) { dfn[v] = low[v] = ++idx; vis[v] = true, st[top++] = v; int u; for(int i = head[v]; i != -1; i = g[i].next) { u = g[i].to; if(dfn[u] == -1) { tarjan(u); low[v] = min(low[v], low[u]); } else if(vis[u]) low[v] = min(low[v], dfn[u]); } if(dfn[v] == low[v]) { num++; do { u = st[--top], vis[u] = false, scc[u] = num; }while(u != v); } } int main() { char str[10]; int a, b, c; while(~ scanf("%d%d", &n, &m)) { init(); for(int i = 1; i <= m; i++) { scanf("%d%d%d%s", &a, &b, &c, str); if(str[0] == 'A') { if(c == 0) add_edge(a, b+n), add_edge(b, a+n); else { add_edge(a, b), add_edge(b, a); add_edge(a+n, a), add_edge(b+n, b); } } else if(str[0] == 'O') { if(c == 0) { add_edge(a, a+n), add_edge(b, b+n); add_edge(a+n, b+n), add_edge(b+n, a+n); } else add_edge(a+n, b), add_edge(b+n, a); } else { if(c == 0) { add_edge(a, b), add_edge(b, a); add_edge(a+n, b+n), add_edge(b+n, a+n); } else { add_edge(a, b+n), add_edge(b, a+n); add_edge(a+n, b), add_edge(b+n, a); } } } for(int i = 0; i < 2*n; i++) if(dfn[i] == -1) tarjan(i); bool flag = true; for(int i = 0; i < n; i++) if(scc[i] == scc[i+n]) { flag = false; break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- 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 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(POJ 六道2-SAT之一)
- poj 3678 Katu Puzzle 2-SAT
- POJ_3678 Katu Puzzle 2-sat
- poj 3678 2-SAT (Katu Puzzle)
- POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang
- POJ 3678 Katu Puzzle(2-SAT)
- 2-sat系列(二) POJ 3678 Katu Puzzle
- POJ 3678 - Katu Puzzle(2-SAT)
- POJ 3678 Katu Puzzle(2-sat)