HDU 4421 Bit Magic(2-sat)
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;
}
HDU 4421 Bit Magic(2-sat)的更多相关文章
- HDU 4421 Bit Magic (图论-2SAT)
Bit Magic Problem Description Yesterday, my teacher taught me about bit operators: and (&), or ( ...
- 图论(2-sat):HDU 4421 Bit Magic
Bit Magic Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 4421 Bit Magic(奇葩式解法)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4421 题目大意: 给了你一段代码, 用一个数组的数 对其进行那段代码的处理,是可以得到一个矩阵 让你判 ...
- hdu 4421 Bit Magic
[题意] 这个函数是给A求B的,现在给你B,问你是否能有A的解存在. [2-SAT解法] 对于每个A[i]的每一位运行2-sat算法,只要跑到强连通就可以结束,应为只要判断是否有解,后面拓扑求解就不需 ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- hdu 3183 A Magic Lamp(RMQ)
题目链接:hdu 3183 A Magic Lamp 题目大意:给定一个字符串,然后最多删除K个.使得剩下的组成的数值最小. 解题思路:问题等价与取N-M个数.每次取的时候保证后面能取的个数足够,而且 ...
随机推荐
- POJ1325Machine Schedule(匈牙利算法)
Machine Schedule Time Limit: 1000MS Memory L ...
- ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...
- POJ 3709 K-Anonymous Sequence(斜率优化DP)
[题目链接] http://poj.org/problem?id=3709 [题目大意] 给出一个长度为n个非严格单调递增数列,每次操作可以使得其中任意一项减一, 问现在使得数列中每项数相同的数的数量 ...
- POJ 3180 The Cow Prom(SCC)
[题目链接] http://poj.org/problem?id=3180 [题目大意] N头牛,M条有向绳子,能组成几个歌舞团?要求顺时针逆时针都能带动舞团内所有牛. [题解] 等价于求点数大于1的 ...
- [xsy1100]东舰停战不可避
没有三点共线 这题的思想来源于JOI2011-2012春季训练合宿Day2T2,原题是个大毒瘤题(p.s.场上有人A,真的可怕),这题作为原题要用到的的一个结论而存在 点有两种颜色,先考虑对所有点做凸 ...
- 【概率dp】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) D. Jon and Orbs
直接暴力dp就行……f(i,j)表示前i天集齐j种类的可能性.不超过10000天就能满足要求. #include<cstdio> using namespace std; #define ...
- 【kmp算法】poj2185 Milking Grid
先对每行求出所有可能的循环节长度(不需要整除). 然后取在所有行中都出现了的,且最小的长度为宽. 然后将每一行看作字符,对所有行求next数组,将n-next[n](对这些行来说最小的循环节长度)作为 ...
- python3开发进阶-Django框架的中间件的五种用法和逻辑过程
阅读目录 什么是中间件 中间件的执行流程 中间件的逻辑过程 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围 ...
- 统计正数和负数的个数,然后计算这些数的平均值 Exercise05_01
import java.util.Scanner; /** * @author 冰樱梦 * * */ public class Exercise05_01{ public static void ma ...
- UWP 程序抛出异常时总是跳到“global::System.Diagnostics.Debugger.Break();”的解决办法
调试 C# 程序时,如果遇到异常,VS 会中断,指出导致异常的语句.但是最近调试 UWP 程序时,发现总是在“global::System.Diagnostics.Debugger.Break();” ...