HDU 4421 Bit Magic

pid=4421" target="_blank" style="">题目链接

题意:就依据题目,给定b数组。看能不能构造出一个符合的a数组

思路:把每一个数字的每一个二进制位单独考虑。就变成一个2-sat题目了,依据题目中的式子建立2-sat的边。然后每一位跑2-sat。假设每位都符合。就是YES,假设有一位不符合就是NO

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std; const int MAXNODE = 505; struct TwoSet {
int n;
vector<int> g[MAXNODE * 2];
bool mark[MAXNODE * 2];
int S[MAXNODE * 2], sn; void init(int tot) {
n = tot * 2;
for (int i = 0; i < n; i += 2) {
g[i].clear();
g[i^1].clear();
}
memset(mark, false, sizeof(mark));
} void add_Edge(int u, int uval, int v, int vval) {
u = u * 2 + uval;
v = v * 2 + vval;
g[u^1].push_back(v);
g[v^1].push_back(u);
} void delete_Edge(int u, int uval, int v, int vval) {
u = u * 2 + uval;
v = v * 2 + vval;
g[u^1].pop_back();
g[v^1].pop_back();
} bool dfs(int u) {
if (mark[u^1]) return false;
if (mark[u]) return true;
mark[u] = true;
S[sn++] = u;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (!dfs(v)) return false;
}
return true;
} bool solve() {
for (int i = 0; i < n; i += 2) {
if (!mark[i] && !mark[i + 1]) {
sn = 0;
if (!dfs(i)){
for (int j = 0; j < sn; j++)
mark[S[j]] = false;
sn = 0;
if (!dfs(i + 1)) return false;
}
}
}
return true;
}
} gao; const int N = 505;
int n, b[N][N]; bool solve() {
for (int k = 0; k < 31; k++) {
gao.init(n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
int tmp = (b[i][j]>>k)&1;
if (i == j) {
if (tmp) return false;
}
else if (i % 2 == 1 && j % 2 == 1) {
if (tmp) gao.add_Edge(i, tmp, j, tmp);
else {
gao.add_Edge(i, tmp, i, tmp);
gao.add_Edge(j, tmp, j, tmp);
}
}
else if (i % 2 == 0 && j % 2 == 0) {
if (tmp) {
gao.add_Edge(i, tmp, i, tmp);
gao.add_Edge(j, tmp, j, tmp);
} else gao.add_Edge(i, tmp, j, tmp);
} else {
if (tmp) {
gao.add_Edge(i, tmp, j, tmp);
gao.add_Edge(i, !tmp, j, !tmp);
} else {
gao.add_Edge(i, tmp, j, !tmp);
gao.add_Edge(i, !tmp, j, tmp);
}
}
}
if (!gao.solve()) return false;
}
return true;
} int main() {
while (~scanf("%d", &n)) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &b[i][j]);
printf("%s\n", solve() ? "YES" : "NO");
}
return 0;
}

最新文章

  1. myeclipse导入项目出现jquery错误(有红叉)
  2. SDN跟网络虚拟化的完美结合
  3. fir.im Weekly - 2015 年开发者调查报告
  4. Java多线程系列--“基础篇”06之 线程让步
  5. Redis事件管理(二)
  6. laravel 表单验证
  7. JS之跨域
  8. linux系统的时间调整
  9. 第十一篇:web之Django之Form组件
  10. json串的使用
  11. codevs 1994 排队 排列组合+高精度
  12. 网络编程 socket-实例
  13. [jQuery] 使用jQuery printPage plugin打印其他頁面內容
  14. 【hihocoder 1039 字符串消除】模拟
  15. yaf代码生成工具的使用
  16. erMaster插件
  17. uWSGI 踩坑记
  18. Web漏洞扫描工具(批量脱壳、反序列化、CMS)
  19. Python创建virtualenv(虚拟环境)方法
  20. model number

热门文章

  1. 初始github——git的简单使用
  2. 浅析module.exports和exports区别和使用
  3. ubuntu 进入 pycharm(社区版)
  4. luogu P1095 守望者的逃离
  5. [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)
  6. 某考试 T2 orzcyr
  7. 【线性筛】【筛法求素数】【素数判定】URAL - 2102 - Michael and Cryptography
  8. 【递推】【卡特兰数】CODEVS 3134 Circle
  9. 数据结构之B-树,你每天都在用的,源码发布!
  10. JS删除数组中某一项或几项的方法汇总