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 ...
随机推荐
- myeclipse中working Sets
最近myeclipse中的项目太多了,看起来老不爽,查找还不方便,发现这个working Sets还是挺好用的 接下来的步骤,太简单了有木有,就不写了 0.0
- 为什么iphone手机比android手机流畅
作为当下最流行.市场占用份额最大的两大手机操作系统IOS和android,目前两者加起来的市场占用率达到90%.我曾经一直用android手机,没有用过iphone,那时候正直iphone4和ipho ...
- WinSock异步IO模型之Select
如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的. Windows操作系统提供了五种I/O模型,分别是: ■ 选择(select): ■ 异步选择(WSAAsyncSelec ...
- myeclipse 10 载入新的项目报错Cannot return from outside a function or method
myeclipse 10 载入新的项目报错Cannot return from outside a function or method 解决方法: 方法一: window -->prefere ...
- linux下oracle11g R2的启动与关闭监听、数据库
su - oracle 切换到oracle账户 lsnrctl start 启动监听 sqlplus /nolog 登陆sqlplus conn /as ...
- C++学习笔记之迭代器
模板是的算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型.理解迭代器是理解STL的关键. 迭代器应该具备的特征: (1)应该能够对迭代器进行解除引用的操作,以便能够访问它引用的值.即如果P ...
- 【HTML】Jquery前台传参及接收
在一些网页应用中,有的时候需要前台之间传递参数,通过JS语法来做一些判断处理. 发送端:(a页面) <a href="b.html?Show=true" id="t ...
- HDU 5590 ZYB's Biology 水题
ZYB's Biology Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...
- 读取svg图片为UIBezierPath,开心做动画
动画预览 先扯淡 最近手痒又想整点动画玩玩,但是想了几个主意发现稍微复杂一点的手写都一定会累爆.这篇文章记录一下今天折腾的一个方案.说来简单,就是用矢量设计工具舒舒服服的做好设计,然后输出成 svg ...
- MHA 安装过程 原创
root@monitor yum.repos.d]# cat CentOS-Base.repo [base]name=CentOS-$releasever - Basefailovermethod=p ...