hdu 4421 Bit Magic
【题意】

这个函数是给A求B的,现在给你B,问你是否能有A的解存在。
【2-SAT解法】
对于每个A[i]的每一位运行2-sat算法,只要跑到强连通就可以结束,应为只要判断是否有解,后面拓扑求解就不需要了。构图和算法思想和基本的2-sat一致,详见我的2-sat博文。
#include <stdio.h>
#include <string.h>
inline int min(int a,int b){return a>b?b:a;}
struct edge
{
int v,next;
edge(int d=,int n=-):v(d),next(n){}
void set(int d,int n){v=d;next=n;}
}data[*];
int head[],hn;
void adde(int a,int b)
{
data[hn].set(b,head[a]);
head[a]=hn++;
}
int n;
int b[][];
int dfn[],low[],sta[],belong[];
bool ifin[];
int top,group,dep;
void tarjan(int u)
{
dfn[u]=low[u]=++dep;
sta[++top]=u;
ifin[u]=true;
for (int i=head[u];i!=-;i=data[i].next)
{
int v=data[i].v;
if (!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
} else
{
if (ifin[v]) low[u]=min(low[u],dfn[v]);
}
}
if (dfn[u]==low[u])
{
int j;
++group;
do
{
j=sta[top--];
belong[j]=group;
ifin[j]=false;
} while (u!=j);
}
}
void init()
{
hn=dep=group=;
top=-;
memset(head,-,sizeof head);
memset(dfn,,sizeof dfn);
memset(ifin,false,sizeof ifin);
}
bool judge()
{
for (int i=;i<n;++i)
if (belong[i]==belong[i+n]) return false;
return true;
}
bool solve()
{
for (int i=;i<n;++i)
for (int j=i;j<n;++j)
{
if (i==j && b[i][j]) return false;
if (b[i][j]!=b[j][i]) return false;
}
for (int k=;k<;++k)
{
init();
for (int i=;i<n;++i)
for (int j=i;j<n;++j)
{
int m=b[i][j]&(<<k);
if (i==j) continue;
if (i& && j&) // |
{
if (m)
{
adde(i,j+n);
adde(j,i+n);
} else
{
adde(i+n,i);
adde(j+n,j);
}
} else if (!(i&) && !(j&)) //&
{
if (m)
{
adde(i,i+n);
adde(j,j+n);
} else
{
adde(i+n,j);
adde(j+n,i);
}
} else // ^
{
if (m)
{
adde(i,j+n);
adde(j,i+n);
adde(j+n,i);
adde(i+n,j);
} else //==
{
adde(i,j);
adde(j,i);
adde(i+n,j+n);
adde(j+n,i+n);
}
}
}
for (int i=;i<(n<<);++i)
if (!dfn[i]) tarjan(i);
if (!judge()) return false;
}
return true;
}
int main()
{
while (~scanf("%d",&n))
{
for (int i=;i<n;++i)
for (int j=;j<n;++j)
scanf("%d",&b[i][j]);
if (solve()) puts("YES"); else puts("NO");
}
}
2-sat
【并查集】
主要思想是以A中每个元素的每一位作为一个基本单位,根据b中的值来确定每一位之间的等价关系,值相等的并在一个集合,每当能确定一个新的关系时验证原先的关系是否矛盾。不过在处理的时候有点小技巧,与2-sat的思想类似,扩充成2N个点,对于每一位,有个点代表其值,另一点代表其值的反。能确定一位的值时要同时更新这2点,从一方面说是充分发掘信息,另一方面说是为了异或运算的判断服务,因为异或不能确定一个值,但能确定相对关系,需要用到反。
并查集的算法在这题里比2-SAT的快,剩了些不必要的计算,思想也挺巧妙的。
#include <stdio.h>
#include <string.h>
#define N 501*32
#define m1 mset.find(1)
#define m0 mset.find(0)
struct myset
{
int uset[*+];
myset(){init();};
void init(){memset(uset,-,sizeof uset);}
int find(int k)
{
if (uset[k]==-) return k;
return uset[k]=find(uset[k]);
}
void uion(int a,int b)
{
int aa=find(a);
int bb=find(b);
if (aa==bb) return;
uset[aa]=bb;
}
}mset;
int b[][],n;
bool solve()
{
for (int i=;i<n;++i)
for (int j=i;j<n;++j)
{
if (i==j && b[i][j]) return false;
if (b[i][j]!=b[j][i]) return false;
}
for (int i=;i<n;++i)
for (int j=;j<n;++j)
{
if (i==j) continue;
if (i& && j&)
{
for (int k=;k<;++k)
{
if (b[i][j]&(<<k) == )
{
int p1=i*+k+;
int p2=j*+k+;
if (mset.find(p1)==m1 || mset.find(p2)==m1 || mset.find(p1)==mset.find(p2+N)) return false;
mset.uion(p1,);
mset.uion(p2,);
mset.uion(p1+N,);
mset.uion(p2+N,);
}
}
} else
if (!(i&) && !(j&))
{
for (int k=;k<;++k)
{
if (b[i][j]&(<<k))
{
int p1=i*+k+;
int p2=j*+k+;
if (mset.find(p1)==m0 || mset.find(p2)==m0 || mset.find(p1)==mset.find(p2+N)) return false;
mset.uion(p1,);
mset.uion(p2,);
mset.uion(p1+N,);
mset.uion(p2+N,);
}
}
} else
{
for (int k=;k<;++k)
{
int p1=i*+k+;
int p2=j*+k+;
if (b[i][j]&(<<k))
{
if (mset.find(p1)==mset.find(p2)) return false;
mset.uion(p1,p2+N);
mset.uion(p2,p1+N);
} else
{
if (mset.find(p1)==mset.find(p2+N) ) return false;
mset.uion(p1,p2);
mset.uion(p1+N,p2+N);
}
}
}
}
return true;
}
int main()
{
while (~scanf("%d",&n))
{
mset.init();
for (int i=;i<n;++i)
for (int j=;j<n;++j)
scanf("%d",&b[i][j]);
if (solve()) puts("YES"); else puts("NO");
}
}
并查集
hdu 4421 Bit Magic的更多相关文章
- HDU 4421 Bit Magic(2-sat)
HDU 4421 Bit Magic pid=4421" target="_blank" style="">题目链接 题意:就依据题目,给定b数 ...
- HDU 4421 Bit Magic(奇葩式解法)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4421 题目大意: 给了你一段代码, 用一个数组的数 对其进行那段代码的处理,是可以得到一个矩阵 让你判 ...
- 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 3183 A Magic Lamp(RMQ)
题目链接:hdu 3183 A Magic Lamp 题目大意:给定一个字符串,然后最多删除K个.使得剩下的组成的数值最小. 解题思路:问题等价与取N-M个数.每次取的时候保证后面能取的个数足够,而且 ...
- hdu 3183 A Magic Lamp RMQ ST 坐标最小值
hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...
- HDU 3183.A Magic Lamp-区间找最小值-RMQ(ST)
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 4421 ZOJ 3656 Bit Magic
2-SAT,不要所有位置全部建好边再判断,那样会MLE的. 正解是,每一位建好边,就进行一次2-SAT. #include<cstdio> #include<cstring> ...
- HDU 3183 - A Magic Lamp - [RMQ][ST算法]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 Problem DescriptionKiki likes traveling. One day ...
随机推荐
- 在CentOS 5.8上搭建PPTP VPN服务
在天朝上网,vpn已经是必备之物了,我也记录一下搭建vpn服务的方法. 1. 确认内核是否支持MPPE模块MPPE用来支持Microsoft Point to Point Encryption, 包括 ...
- UI:转自互联网资料
1.UIWindow和UIView和 CALayer 的联系和区别? 答:UIView是视图的基类,UIViewController是视图控制器的基类,UIResponder是表示一个可以在屏幕上 ...
- urlrewritingnet 域名http状态302 问题(转)
UrlRewritingNet is an Url rewriting tool for ASP .Net and Elmahis a module for logging unhandled err ...
- js 重载i
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- gdb简单调试~core文件
1.打开终端,进入项目目录,输入ulimit -a ,可以看core文件大小设置(第一行),若为0, 则没有打开core dump设置. 2.ulimit -c unlimited ,core文件大小 ...
- jQuery + jQuery Mobile 实现省市二级下拉列表页面
一.需求: 提供省.市下拉列表,当用户选择省一级下拉列表项后,市下拉列表的各个选项自动变为该省对应的城市列表. 二.效果: 三.实现: 1.省市json数据,来自: http://www.cnblog ...
- Codeforces Gym 100015C City Driving 离线LCA
City Driving 题目连接: http://codeforces.com/gym/100015/attachments Description You recently started fre ...
- 你可能不知道的SQL问题
1. 如下是sql语句和结果, SELECT count(*) AS total FROM orders; +-------+ | total | +-------+ | 150 | +------ ...
- ios开发——实用技术篇Swift篇&照片选择
照片选择 // MARK: - 选择照片 /*----- 选择照片 ------*/ @IBAction func addImageButtonClick() { let actionSheet = ...
- POJ 3126 Prime Path (BFS)
[题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ...