HDU 4421 Bit Magic 【2-SAT】
来源:互联网 发布:c语言程序实例代码 编辑:程序博客网 时间:2024/05/17 21:51
HDU - 4421传送门
题意:
给一个有一个一维数组通过一定的逻辑运算得到的矩阵,问存在不存在一个一维数组满足要求。
分析:
2-SAT模板题 附上2-SAT逻辑转化表,把每个元素都看作30个布尔值。建立30个图,只有都满足啦2-SAT。
#include<bits/stdc++.h>using namespace std;const int N=505;int b[N][N],n,c,n2,S[N*2];bool mark[N*2];vector<int> g[N*2];bool check(){ for(int i=0;i<n;i++) { if(b[i][i]!=0)return false; for(int j=i+1;j<n;j++) { if(b[i][j]!=b[j][i]) return false; } } return true;}bool dfs(int x){ if(mark[x^1])return false; if(mark[x])return true; mark[x]=true; S[c++]=x; for(int i=0;i<g[x].size();i++) if(!dfs(g[x][i]))return false; return true;}bool solve(){ for(int i=0;i<n2;i+=2) { if(!mark[i]&&!mark[i+1]) { c=0; if(!dfs(i)) { while(c>0)mark[S[--c]]=false; if(!dfs(i+1))return false; } } } return true;}int main(){ while(scanf("%d",&n)!=EOF) { n2=n<<1; bool flag=true; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&b[i][j]); if(!check()) { printf("NO\n"); continue; } for(int k=0;k<=30;k++) { memset(mark,false,sizeof(mark)); for(int i=0;i<n2;i++)g[i].clear(); for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(i%2==1&&j%2==1) { if(b[i][j]&(1<<k)) { g[i<<1].push_back(j<<1|1); g[j<<1].push_back(i<<1|1); } else { g[i<<1|1].push_back(i<<1); g[j<<1|1].push_back(j<<1); //mark[i<<1]=mark[j<<1]=true; } } else if(i%2==0&&j%2==0) { if(b[i][j]&(1<<k)) { g[i<<1].push_back(i<<1|1); g[j<<1].push_back(j<<1|1); //mark[i<<1|1]=mark[j<<1|1]=true; } else { g[i<<1|1].push_back(j<<1); g[j<<1|1].push_back(i<<1); } } else { if(b[i][j]&(1<<k)) { g[i<<1|1].push_back(j<<1); g[i<<1].push_back(j<<1|1); g[j<<1|1].push_back(i<<1); g[j<<1].push_back(i<<1|1); } else { //cout<<"^1"; g[i<<1|1].push_back(j<<1|1); g[i<<1].push_back(j<<1); g[j<<1|1].push_back(i<<1|1); g[j<<1].push_back(i<<1); } } if(!solve()) { flag=false; break; } } if(flag) puts("YES"); else puts("NO"); } return 0;}
2.2-sat实现方法二,建好图后,跑一次强连通分量,属于一个强连通分量的布尔值相同,如果x和~x都属于一个强连通分量,就没有成立方案。
#include<bits/stdc++.h>using namespace std;const int N=1010;const int M=1000100;vector<int> bcc[N],g[N];bool insta[N];int head[N],dfn[N],low[N],sta[N],belong[N],n2,b[505][505];int nu,top,tot,sent,n,m;struct edge{ int from,to,nex;}e[M];void add(int from,int to){ e[nu].from=from; e[nu].to=to; e[nu].nex=head[from]; head[from]=nu++;}void tarjan(int x){ low[x]=dfn[x]=++tot; sta[top++]=x; insta[x]=true; for(int i=head[x];i!=-1;i=e[i].nex) { int y=e[i].to; if(!dfn[y]) { tarjan(y); low[x]=min(low[x],low[y]); } else if(insta[y]&&low[x]>dfn[y]) low[x]=dfn[y]; } if(low[x]==dfn[x]) { int t; sent++; bcc[sent].clear(); do { t=sta[--top]; insta[t]=false; belong[t]=sent; bcc[sent].push_back(t); }while(t!=x); }}void init(){ nu=1; memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); memset(insta,false,sizeof(insta)); for(int i=0;i<n2;i++)bcc[i].clear();}bool solve(){ sent=top=tot=0; for(int i=0;i<n2;i++) if(!dfn[i]) tarjan(i); for(int i=0;i<n2;i+=2) { if(belong[i]==belong[i^1]) return false; } return true;}bool check(){ for(int i=0;i<n;i++) { if(b[i][i]!=0)return false; for(int j=i+1;j<n;j++) { if(b[i][j]!=b[j][i]) return false; } } return true;}int main(){ while(scanf("%d",&n)!=EOF) { n2=n<<1; bool flag=true; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&b[i][j]); if(!check()) { printf("NO\n"); continue; } for(int k=0;k<=30;k++) { init(); for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(i%2==1&&j%2==1) { if(b[i][j]&(1<<k)) { add(i<<1,j<<1|1); add(j<<1,i<<1|1); } else { add(i<<1|1,i<<1); add(j<<1|1,j<<1); } } else if(i%2==0&&j%2==0) { if(b[i][j]&(1<<k)) { add(i<<1,i<<1|1); add(j<<1,j<<1|1); } else { add(i<<1|1,j<<1); add(j<<1|1,i<<1); } } else { if(b[i][j]&(1<<k)) { add(i<<1|1,j<<1); add(i<<1,j<<1|1); add(j<<1|1,i<<1); add(j<<1,i<<1|1); } else { //cout<<"^1"; add(i<<1|1,j<<1|1); add(i<<1,j<<1); add(j<<1|1,i<<1|1); add(j<<1,i<<1); } } if(!solve()) { flag=false; break; } } if(flag) puts("YES"); else puts("NO"); } return 0;}
阅读全文
0 0
- hdu 4421 Bit Magic(2-SAT)
- 【2-SAT】 HDU 4421 Bit Magic
- HDU 4421 Bit Magic(2-sat)
- 【HDU】4421 Bit Magic 2-sat
- HDU 4421 - Bit Magic(2-SAT)
- hdu 4421 Bit Magic 2-sat
- HDU 4421 Bit Magic 2sat
- HDU 4421 Bit Magic(2-SAT)
- HDU 4421 Bit Magic【2-SAT】
- HDU 4421 Bit Magic 【2-SAT】
- hdu 4421 Bit Magic(2-sat,4级)
- hdu 4421 Bit Magic (位分离+2-sat)
- HDU 4421 Bit Magic (图论-2SAT)
- hdu 4421 Bit Magic【2--Sat----------Tarjan强连通】
- HDU 4421Bit Magic 2-sat判断可行解
- hdu 4421 Bit Magic(two-SAT+思维)
- HDU4421 Bit Magic 【2-sat】
- hdu4421 Bit Magic 2-sat
- error: command 'gcc' failed with exit status 1
- matlab扩展编程里面的初始化问题
- 5.10
- Netty源码分析(八)—内存池分析
- [BZOJ3282]LCT模板(单点修改,区间查询)
- HDU 4421 Bit Magic 【2-SAT】
- 数据hive常见问题
- 解决vue2.0路由跳转未匹配相应路由而出现空白页面的问题
- golang中recover和panic用法
- C3P0连接池XML版
- MIT18.06线性代数课程笔记12:使用邻接矩阵证明欧拉定理
- 【Scikit-Learn 中文文档】多类和多标签算法
- 简明 VIM 练级攻略(转)
- Java String操作