HDU 4421 Bit Magic【2-SAT】
来源:互联网 发布:现在淘宝卖什么好 编辑:程序博客网 时间:2024/05/28 05:18
题目链接
裸的2-SAT问题,学习了一下如何套模板。要找到矛盾,如果A则不能B,就把A和B加入边。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;#define ll long longconst int MAXN = 505 * 2;//逻辑变量的个数const int MAXM = 505 * 505 * 3; //表达式的个数struct Edge { int to, next;} edge[MAXM];int head[MAXN], cntE;void init() { cntE = 0; memset(head, -1, sizeof head);}void addedge(int u, int v) { edge[cntE].to = v; edge[cntE].next = head[u]; head[u] = cntE++;}bool vis[MAXN];int stk[MAXN], top;bool dfs(int u) { if (vis[u ^ 1]) return false; if (vis[u]) return true; vis[u] = true; stk[top++] = u; for (int i = head[u]; ~i; i = edge[i].next) { if (!dfs(edge[i].to)) return false; } return true;}inline bool sat(int n) { memset(vis, false, sizeof vis); for (int i = 0; i < n; ++i) { if (vis[i] || vis[i ^ 1]) continue; top = 0; if (!dfs(i)) { while (top) vis[stk[--top]] = false; if (!dfs(i ^ 1)) return false; } } return true;}ll b[505][505];int N;int getw(int w, ll s){ ll jd = 1 << w; return (jd & s) >> w;}void addkind(int w, ll s, int i, int j, int kind){ i *= 2; j *= 2; int p = getw(w, s); if (kind == 1) // | { if (p) { addedge(i ^ 1, j); addedge(j ^ 1, i); } else { addedge(i ^ 1, j ^ 1); addedge(j ^ 1, i ^ 1); } } else if (kind == 2)// & { if (p) { addedge(i, j); addedge(j, i); } else { addedge(i, j ^ 1); addedge(j, i ^ 1); } } else if (kind == 3)// ^ { if (p) { addedge(i, j ^ 1); addedge(i ^ 1, j); addedge(j, i ^ 1); addedge(j ^ 1, i); } else { addedge(i ^ 1, j ^ 1); addedge(i, j); addedge(j ^ 1, i ^ 1); addedge(j, i); } }}bool ok(int w)//第w位{ for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) { if (b[i][j] != 0) return false; } else if (i % 2 == 1 && j % 2 == 1)// | addkind(w, b[i][j], i, j, 1); else if (i % 2 == 0 && j % 2 == 0)// & addkind(w, b[i][j], i, j, 2); else // ^ addkind(w, b[i][j], i, j, 3); } } return sat(N * 2);}int main(){ while (scanf("%d", &N) != EOF) { for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) scanf("%lld", &b[i][j]); bool flag = true; for (int w = 0; w <= 31; w++) { init(); if (ok(w) == false) { flag = false; break; } } if (flag) printf("YES\n"); else printf("NO\n"); } return 0;}
阅读全文
0 0
- hdu 4421 Bit Magic(2-SAT)
- 【2-SAT】 HDU 4421 Bit Magic
- HDU 4421 Bit Magic(2-sat)
- 【HDU】4421 Bit Magic 2-sat
- HDU 4421 - Bit Magic(2-SAT)
- hdu 4421 Bit Magic 2-sat
- HDU 4421 Bit Magic 2sat
- HDU 4421 Bit Magic(2-SAT)
- HDU 4421 Bit Magic【2-SAT】
- HDU 4421 Bit Magic 【2-SAT】
- hdu 4421 Bit Magic(2-sat,4级)
- hdu 4421 Bit Magic (位分离+2-sat)
- HDU 4421 Bit Magic (图论-2SAT)
- hdu 4421 Bit Magic【2--Sat----------Tarjan强连通】
- HDU 4421Bit Magic 2-sat判断可行解
- hdu 4421 Bit Magic(two-SAT+思维)
- HDU4421 Bit Magic 【2-sat】
- hdu4421 Bit Magic 2-sat
- data:image/png;base64
- Xcode 怎么删除 Provisioning Profle
- SHA3 加密算法C语言测试代码(基于Keccak算法)
- 远程桌面连接TeamViewer的使用
- Android 热修复 Tinker 接入
- HDU 4421 Bit Magic【2-SAT】
- js判断是否是微信浏览器
- Android studio Gradle插件从3.0.0降到2.3.3时碰到的问题
- integer自动装箱拆箱&String内存分配测试
- Adreno GPU Profiler工具使用总结
- ajax、json
- MySQL操作详解
- Linux ls 命令
- AdrenoProfiler对opengles的性能分析