HDU 4421 Bit Magic

题目链接

题意:就依据题目,给定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;
}

HDU 4421 Bit Magic(2-sat)相关推荐

  1. [ACM] hdu 1671 Phone List (字典树)

    [ACM] hdu 1671 Phone List (字典树) Phone List Problem Description Given a list of phone numbers, determ ...

  2. hdu 2021 发工资咯:)(c语言)

    hdu 2021 发工资咯:) 点击做题网站链接 题目描述 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  3. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  4. 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)

    物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...

  5. R语言用WinBUGS 软件对学术能力测验(SAT)建立层次(分层)贝叶斯模型

    R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开始).WinBUGS流程完成后,可以通过程序包本身将结果数据读 ...

  6. R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型

    原文链接:http://tecdat.cn/?p=11974 R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开 ...

  7. 布尔表达式可满足性问题(SAT)与库克-列文定理(上)

    下篇:布尔表达式可满足性问题(SAT)与库克-列文定理(下). 文章目录 一.布尔表达式可满足性问题(Boolean Satisfiability Problem, SAT) 二.形式语言与自动机 1 ...

  8. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)

    HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包 ...

  9. hdu 3183 A Magic Lamp (rmq)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 #include <stdio.h> #include <stdlib.h&g ...

  10. (2 sat) hdu 1824

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

最新文章

  1. 批量修改所有服务器的dbmail配置
  2. jquery easyUI分页dataGrid-Json
  3. 【新星计划】MATLAB-微积分
  4. swagge php token,swagger在thinkphp6的使用方式
  5. oracle 区管理系统,oracle区管理和段空间管理详细介绍
  6. Linux系统有线网络抓包程序
  7. 阿里安全的“自动逆向机器人”TimePlayer 究竟是什么
  8. mysql中清空数据库,并重置主键为1
  9. visual studio如何用低版本打开高版本项目
  10. Nginx+ffmpeg的HLS开源server搭建配置及开发具体解释
  11. android开发环境搭建——android studio
  12. factoryreset恢复出厂设置测试
  13. 下载哔哩哔哩代码php,哔哩哔哩电脑客户端 v1.4.4 官方最新版
  14. 爱奇艺体育获5亿元战略融资 ,IDG资本、汇盈博润领投
  15. SpringCloud 学习笔记(2 / 3)
  16. proteus8单片机c语言仿真教程,入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例...
  17. VTK图形处理之剪裁
  18. 谷歌股票“一拆二”实为夯实掌舵权
  19. springboot启动错误 Could not resolve placeholder
  20. python——字符串练习:句子反转

热门文章

  1. 魔方与科学和计算机表现李世春,科学网—魔方 - 李世春的博文
  2. python的cubes怎么使用_Python之Cubes框架使用
  3. 职称计算机和英语有效性,2015职称计算机考试突破小诀窍
  4. mysql 5.7 group_mysql,_mysql5.7中group by和mysql5.5中group by的结果不一样,mysql - phpStudy...
  5. Perl中的执行上下文
  6. C++ 对象的内存布局【转】
  7. 《Objective-C函数速查实例手册》——导读
  8. boost::bind 与 boost::function 的使用方法例子
  9. 简单实现ToolStripMenuItem(菜单栏)的单选效果
  10. 兼容sdk7iOS7的issue解决小片段总结