HDU 4421 Bit Magic(2-sat)
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)相关推荐
- [ACM] hdu 1671 Phone List (字典树)
[ACM] hdu 1671 Phone List (字典树) Phone List Problem Description Given a list of phone numbers, determ ...
- hdu 2021 发工资咯:)(c语言)
hdu 2021 发工资咯:) 点击做题网站链接 题目描述 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDU 1043 Eight(八数码)
HDU 1043 Eight(八数码) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)
物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...
- R语言用WinBUGS 软件对学术能力测验(SAT)建立层次(分层)贝叶斯模型
R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开始).WinBUGS流程完成后,可以通过程序包本身将结果数据读 ...
- R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型
原文链接:http://tecdat.cn/?p=11974 R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开 ...
- 布尔表达式可满足性问题(SAT)与库克-列文定理(上)
下篇:布尔表达式可满足性问题(SAT)与库克-列文定理(下). 文章目录 一.布尔表达式可满足性问题(Boolean Satisfiability Problem, SAT) 二.形式语言与自动机 1 ...
- hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)
HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包 ...
- hdu 3183 A Magic Lamp (rmq)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 #include <stdio.h> #include <stdlib.h&g ...
- (2 sat) hdu 1824
Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
最新文章
- 批量修改所有服务器的dbmail配置
- jquery easyUI分页dataGrid-Json
- 【新星计划】MATLAB-微积分
- swagge php token,swagger在thinkphp6的使用方式
- oracle 区管理系统,oracle区管理和段空间管理详细介绍
- Linux系统有线网络抓包程序
- 阿里安全的“自动逆向机器人”TimePlayer 究竟是什么
- mysql中清空数据库,并重置主键为1
- visual studio如何用低版本打开高版本项目
- Nginx+ffmpeg的HLS开源server搭建配置及开发具体解释
- android开发环境搭建——android studio
- factoryreset恢复出厂设置测试
- 下载哔哩哔哩代码php,哔哩哔哩电脑客户端 v1.4.4 官方最新版
- 爱奇艺体育获5亿元战略融资 ,IDG资本、汇盈博润领投
- SpringCloud 学习笔记(2 / 3)
- proteus8单片机c语言仿真教程,入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例...
- VTK图形处理之剪裁
- 谷歌股票“一拆二”实为夯实掌舵权
- springboot启动错误 Could not resolve placeholder
- python——字符串练习:句子反转
热门文章
- 魔方与科学和计算机表现李世春,科学网—魔方 - 李世春的博文
- python的cubes怎么使用_Python之Cubes框架使用
- 职称计算机和英语有效性,2015职称计算机考试突破小诀窍
- mysql 5.7 group_mysql,_mysql5.7中group by和mysql5.5中group by的结果不一样,mysql - phpStudy...
- Perl中的执行上下文
- C++ 对象的内存布局【转】
- 《Objective-C函数速查实例手册》——导读
- boost::bind 与 boost::function 的使用方法例子
- 简单实现ToolStripMenuItem(菜单栏)的单选效果
- 兼容sdk7iOS7的issue解决小片段总结