hdu 4421 2-SAT问题
思路:我们需要判断是否有满足的a[n],其实也就是对每一个二进制位进行判断,看是否有满足的。那么我们每次取出一个二进制位,这样每一位只有0,1两种状态,就成了比较典型的2-SAT问题了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define Maxn 1010
#define Maxm Maxn*Maxn
using namespace std;
int vi[Maxn],head[Maxn],dfn[Maxn],low[Maxn],e,n,lab,top,num,m,id[Maxn],Stack[Maxn],B[][];
struct Edge{
int u,v,next;
}edge[Maxm];
void init()//初始化
{
memset(vi,,sizeof(vi));
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(id,,sizeof(id));
e=lab=top=num=;
}
void add(int u,int v)//加边
{
edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;
}
void Tarjan(int u)//找出强连通分支
{
int i,j,v;
//cout<<u<<endl;
dfn[u]=low[u]=++lab;
Stack[top++]=u;
vi[u]=;
for(i=head[u];i!=-;i=edge[i].next)
{
v=edge[i].v;
if(!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
if(vi[v])
low[u]=min(low[u],dfn[v]); }
if(low[u]==dfn[u])
{
++num;
do{
i=Stack[--top];
vi[i]=;
id[i]=num;
}while(i!=u);
}
}
int Ok()
{
int i,j;
for(i=;i<n;i++)
for(j=i+;j<n;j++)
{
if(i==j&&(B[i][j]!=||B[j][i]!=))
return ;
if(B[i][j]!=B[j][i])
return ;
}
return ;
}
void buildGraphic(int k)
{
int i,j,temp;
for(i=;i<n-;i++)
for(j=i+;j<n;j++)
{
if(i%==&&j%==)
{
temp=(<<k);
if(B[i][j]&temp)
{
add(i,j+n);
add(j,i+n);
}
else
{
add(i+n,j);
add(j+n,i);
add(i,j);
add(j,i);
add(i+n,j+n);
add(j+n,i+n);
}
}
else
if(i%==&&j%==)
{
temp=(<<k);
if(B[i][j]&temp)
{
add(i,j+n);
add(j,i+n);
add(i,j);
add(j,i);
add(i+n,j+n);
add(j+n,i+n);
}
else
{
add(i+n,j);
add(j+n,i);
}
}
else
{
temp=(<<k);
if(B[i][j]&temp)
{
add(i,j+n);
add(j,i+n);
add(i+n,j);
add(j+n,i);
}
else
{
add(i,j);
add(j,i);
add(i+n,j+n);
add(j+n,i+n);
}
}
}
}
int solve(int k)
{
int i,j;
buildGraphic(k);
for(i=;i<*n;i++)
{
if(!dfn[i])
Tarjan(i);
}
for(i=;i<n;i++)
{
if(id[i]==id[i+n])
return ;
}
return ;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=;i<n;i++)
for(j=;j<n;j++)
scanf("%d",&B[i][j]);
if(!Ok())
{
printf("NO\n");
continue;
}
int k;
for(k=;k<=;k++)//每次取出一个二进制位,进行2-SAT判定
{
init();
if(!solve(k))
break;
}
if(k<=)
printf("NO\n");
else
printf("YES\n");
}
return ;
}
hdu 4421 2-SAT问题的更多相关文章
- 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(枚举+2-sat)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4421 思路:枚举32位bit,然后2-sat判断可行性,这里给出2-sat矛盾关系构图: 1.a&am ...
- HDU 4421 Bit Magic (图论-2SAT)
Bit Magic Problem Description Yesterday, my teacher taught me about bit operators: and (&), or ( ...
- hdu 4421 Bit Magic
[题意] 这个函数是给A求B的,现在给你B,问你是否能有A的解存在. [2-SAT解法] 对于每个A[i]的每一位运行2-sat算法,只要跑到强连通就可以结束,应为只要判断是否有解,后面拓扑求解就不需 ...
- hdu 4115 (2—SAT)
题意:两个人石头剪刀布,一个人的出法已确定,另一个人的出法有一定约束,某两次要相同或者不同,问你第二个人能否全部都不失败. 思路:根据Bob出的情况,我们可以确定每次Alice有两种方案. R与P,S ...
- 图论(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 ZOJ 3656 Bit Magic
2-SAT,不要所有位置全部建好边再判断,那样会MLE的. 正解是,每一位建好边,就进行一次2-SAT. #include<cstdio> #include<cstring> ...
- hdu 4421 和poj3678类似二级制操作(2-sat问题)
/* 题意:还是二进制异或,和poj3678类似 建边和poj3678一样 */ #include<stdio.h> #include<string.h> #include&l ...
随机推荐
- POJ 1502 MPI Maelstrom(最短路)
MPI Maelstrom Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4017 Accepted: 2412 Des ...
- RHEL安装配置JAVA
查看当前java版本 [root@esb-mmplus-04 ~]# java -version java version "1.6.0_24" OpenJDK Runtime E ...
- 关于session更新的问题
最近在学习用ssh框架做一个实习生招聘系统,已经做了大半.今天突然想到一个问题,在登录的时候我把用户的所有信息放到session中去,那么我不同用户同时登录的时候session中的信息是否会被覆盖掉( ...
- Lua学习笔记(一):搭建开发环境
Lua是一个小巧高效的解释型脚本语言,可以方便的嵌入到任意的语言中,很多应用程序.游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性.可扩展性.这其中包括魔兽世界.博德之门.愤怒的小鸟.VOC ...
- Understanding CloudStack’s Physical Networking Architecture
Understanding and configuring the physical connections of a host in a CloudStack deployment can at f ...
- mysql 内外链接
外联结:分为外左联结和外右联结. 左联结A.B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录 ...
- JAVA-开发环境搭建之JDK安装配置教程
在进行java开发前先要搭建java的开发环境 下载java的开发环境eclipse 安装&配置环境变量 1,JDK安装
- Codeforces Round #274 (Div. 1) C. Riding in a Lift 前缀和优化dp
C. Riding in a Lift Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/480/pr ...
- hihocoder #1224 : 赛车 dfs
#1224 : 赛车 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/1224 ...
- GLSL实现Fresnel And Chromatic aberration 【转】
http://blog.csdn.net/a3070173/archive/2008/11/13/3290091.aspx 使用Shader实现菲涅尔和颜色色散效果很简单,在Cg教程和OpenGL S ...