hdu4421-Bit Magic(2-SAT)
题意

根据图中公式由A[]构造B[][],现在给你B,问你存不存在一个数组A使之成立。
题解:对于每一位进行2-sat求解。
比赛半个小时时间,没做出来……
一直T。
因为本身对算法不确定,所以也不知道怎么办
赛后才发现是数组开小了、、、、
真坑啊。。。
#include <bits/stdc++.h> using namespace std; const int N = ;
int a[N], b[N][N]; struct Edge {
int from, to, next;
} edge[N*N*];
int head[N], cntE; void addedge(int u, int v) {
edge[cntE].from = u;
edge[cntE].to = v;
edge[cntE].next = head[u];
head[u] = cntE++;
} int dfn[N], low[N], idx;
int stk[N], top;
int in[N];
int kind[N], cnt; void tarjan(int u) {
dfn[u] = low[u] = ++idx;
in[u] = true;
stk[++top] = u;
for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
else if (in[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++cnt;
while () {
int v = stk[top--];
kind[v] = cnt;
in[v] = false;
if (v == u) break;
}
}
} int opp[N], ind[N], col[N];
bool topsort(int n) {
for (int i = ; i < *n; ++i) {
if (!dfn[i]) tarjan(i);
}
for (int i = ; i < n; ++i) {
int k1 = kind[i], k2 = kind[i+n];
if (k1 == k2) return false;
}
return true;
} void init() {
cntE = ;
memset(head, -, sizeof head);
memset(dfn, , sizeof dfn);
memset(in, false, sizeof in);
idx = top = cnt = ;
memset(ind, , sizeof ind);
memset(col, , sizeof col);
} int main()
{
//freopen("in.txt", "r", stdin); int n;
while (~scanf("%d", &n)) {
for (int i = ; i < n; ++i) {
for (int j = ; j < n; ++j) {
scanf("%d", &b[i][j]);
}
} bool fg = true; for (int i = ; i < n; ++i) {
for (int j = i; j < n; ++j) {
if (i == j) {
if (b[i][j] != ) {
fg = false;
break;
}
} else if (b[i][j] != b[j][i]) {
fg = false;
break;
}
}
if (!fg) break;
} if (!fg) {
printf("NO\n");
continue;
} for (int w = ; w <= ; ++w) {
init();
int cnt = ;
for (int i = ; i < n; ++i) {
for (int j = i+; j < n; ++j) {
//if (i == j) continue; if (i % == && j % == ) {
if (b[i][j] & ( << w)) {
addedge(i, i+n);
addedge(j, j+n);
} else {
addedge(j+n, i);
addedge(i+n, j);
}
} else if (i % == && j % == ) {
if (b[i][j] & ( << w)) {
addedge(j, i+n);
addedge(i, j+n);
} else {
addedge(i+n, i);
addedge(j+n, j);
}
} else {
if (b[i][j] & ( << w)) {
addedge(i, j+n);
addedge(j, i+n);
addedge(j+n, i);
addedge(i+n, j);
} else {
addedge(i, j);
addedge(j, i);
addedge(i+n, j+n);
addedge(j+n, i+n);
}
}
}
}
if (!topsort(n)) {
fg = false;
break;
}
} if (fg) printf("YES\n");
else printf("NO\n");
}
return ;
}
hdu4421-Bit Magic(2-SAT)的更多相关文章
- POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
- 学习笔记(two sat)
关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...
- FZU 2280 Magic(字符串Hash)题解
题意:给你n个字符串,每个字符串有一个值w,有q次询问,一共两种操作:一是“1 x y”表示把第x个串的w变为y:二是“2 x”,输出第x个串能放几次魔法.放魔法的条件是这样:用串x放魔法,如果在1~ ...
- 2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02) H Heroes Of Might And Magic (隐含dp)
问题是求一个方案,实际隐含一个dp.法力是递减的,所以状态是DAG,对于一个确定的状态,我们贪心地希望英雄的血量尽量大. 分析:定义状态dp[i][p][h]表示是已经用了i的法力值,怪兽的位置在p, ...
- Katu Puzzle POJ - 3678 (2 - sat)
有N个变量X1X1~XNXN,每个变量的可能取值为0或1. 给定M个算式,每个算式形如 XaopXb=cXaopXb=c,其中 a,b 是变量编号,c 是数字0或1,op 是 and,or,xor 三 ...
- HDU 4421 Bit Magic (图论-2SAT)
Bit Magic Problem Description Yesterday, my teacher taught me about bit operators: and (&), or ( ...
- Math Magic(完全背包)
Math Magic Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Sta ...
- CF 1064B Equations of Mathematical Magic(思维规律)
Description Colossal! — exclaimed Hawk-nose. — A programmer! That's exactly what we are looking for. ...
- LA 3211 飞机调度(2—SAT)
https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...
- 【Beginning Python】抽象(未完)
[懒惰即是美德] 抽象意味着良好的可读性:说明你在努力做什么,而不是给出你正在如何做的细节. [抽象和结构] 程序应该是非常抽象的,就像“下载网页.计算频率.打印每个单词的频率”一样易懂.翻译成程序就 ...
随机推荐
- POJ 1944 - Fiber Communications
原题地址:http://poj.org/problem?id=1944 题目大意:有n个点排成一圈,可以连接任意两个相邻的点,给出 p 对点,要求这 p 对点必须直接或间接相连,求最少的连接边数 数据 ...
- core--线程同步(内核模式)
什么是内核?windows操作系统为了更好的管理进程,线程,创建了很多数据结构,这些数据结构运行在windows的底层,并不开放给开发人员:所以开发人员称这些结构为内核,但是为了开发人员能够使用,wi ...
- Qt之QHeaderView排序
简述 在Windows中我们经常会遇到表头排序,比如可以对文件按照名称.修改日期.类型.大小进行排序,方便我们统一的归类查找. Qt中,我们可以通过点击表头来对QTableView或QTreeView ...
- LeetCode Reverse Linked List II 反置链表2
题意:将指定的一段位置[m,n]的链表反置,返回链表头. 思路:主要麻烦在链表头,如果要从链表头就开始,比较特殊. 目前用DFS实现,先找到m-1的位置,再找到n+1的位置,中间这段就是否要反置的,交 ...
- Excel学习笔记杂荟
Excel学习 一.工具->选项 可以对整个excel里面的东西进行编辑,里面有隐藏行号,下拉档等选项,有文档作者信息. 隐藏网格等 二.单元格内容比较大可以右击单元格->设置单元格格式- ...
- Android View绘制13问13答
1.View的绘制流程分几步,从哪开始?哪个过程结束以后能看到view? 答:从ViewRoot的performTraversals开始,经过measure,layout,draw 三个流程.draw ...
- jacob如何获取word文档的页码
ActiveXComponent app = new ActiveXComponent("Word.Application"); //启动word String inFile = ...
- myeclipse10添加jQuery自动提示
首先先要在装上spket插件,这个网上有好多教程,我就不详细说了,主要说一下后面的设置,因为我发现我按照网上的装完也设置完没办法使用自动提示功能,以下是我根据前辈的经验然后自己摸索出来的: 选中所建的 ...
- Microsoft Visual Studio 2010中文版编译SQLlite3.7.0版
作为一名教师,没有具体项目的开发,却喜欢尝鲜,不经意间开始追星了. 换了Win7,安装了Microsoft Visual Studio 2010中文版,7月22日SQLite发布了3.7.0版.当然想 ...
- C++中,申请字符串数组可用new实现
C++中,申请字符串数组可用new实现: char ** list = new char*[MAX_NUM]; for (int i = 0; i< MAX_LOOP; i++) list[i] ...