HDU 4421 2-SAT
来源:互联网 发布:软件功能 编辑:程序博客网 时间:2024/04/30 07:56
这题我做了5小时啊亲~~
昨天才学得2-SAT,今天来做这道表示对建图压力很大,= =
每次32次2-SAT 爽爆了!!
建单向边AC了 双向边就WA 但是不是G[I][J]=A[I]|A[J] G[J][I]=A[J]|A[I], 图是对称的啊。。这样下来,边不也该双向了吗?没搞懂
#include<stdio.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<string.h>#include<algorithm>#include<queue>#include<vector>#include<map>#include<string>#define ll __int64typedef long long LL;#define INF 0x7fffffffffffffff#define inf 0x7fffffff#define eps 1e-10#define pi acos(-1.0)#define FRE freopen("in.txt","r",stdin)#define E exp(1.0)#define log2(x) log((x))/log(2.0)#define maxn 1010#define maxe 1001000using namespace std;struct node{ int v,next;}edge[maxe];int n;int size,head[maxn];int dfn[maxn],low[maxn],sstack[maxn],instack[maxn],scc[maxn];int idex,cnt,top;int g[510][510];int bit[maxn];void init(){ memset(head,-1,sizeof(head)); memset(dfn,-1,sizeof(dfn)); memset(instack,0,sizeof(instack)); idex=cnt=size=0,top=-1;}void addedge(int u,int v){ edge[size].v=v; edge[size].next=head[u]; head[u]=size++;}void build(int id){ int i,j; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(i%2==1&&j%2==1) { int t=(g[i][j]/(1<<id))%2; //printf("%d\n",t); if(t==1) { addedge(i,j+n); addedge(j,i+n); //addedge(bit[j+n],bit[i]); //addedge(bit[i+n],bit[j]); } else if(t==0) { addedge(i+n,i); //addedge(bit[i],bit[i+n]); addedge(j+n,j); //addedge(bit[j],bit[j+n]); } } else if(i%2==0&&j%2==0) { int t=(g[i][j]/(1<<id))%2; //printf("%d\n",t); if(t==1) { addedge(i,i+n); //addedge(bit[i+n],bit[i]); addedge(j,j+n); //addedge(bit[j+n],bit[j]); } else if(t==0) { addedge(j+n,i); //addedge(bit[i],bit[j+n]); addedge(i+n,j); //addedge(bit[j],bit[i+n]); } } else { int t=(g[i][j]/(1<<id))%2; //printf("%d\n",t); if(t==1) { addedge(i+n,j); addedge(j,i+n); addedge(j+n,i); addedge(i,j+n); } else if(t==0) { addedge(i,j); addedge(j,i); addedge(i+n,j+n); addedge(j+n,i+n); } } } }}void tarjan(int u){ sstack[++top]=u; instack[u]=1; dfn[u]=low[u]=idex++; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(dfn[v]==-1) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) { low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]) { for(int v=-1;v!=u;top--) { v=sstack[top]; instack[v]=0; scc[v]=cnt; } cnt++; }}void solve(){ for(int i=0;i<2*n;i++) { if(dfn[i]==-1) tarjan(i); }}bool check(){ for(int i=0;i<n;i++) { if(scc[i]==scc[i+n]) return false; } return true;}int main() { //FRE; while(scanf("%d",&n)==1) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&g[i][j]); for(i=0;i<n;i++) { bit[i]=0; bit[i+n]=1; } int flag=0; for(i=0;i<32;i++) { init(); build(i); solve(); if(check()==false) { flag=1; break; } } if(flag) printf("NO\n"); else printf("YES\n"); } return 0;}
- HDU 4421 2-SAT
- HDU 4421 2-sat
- HDU 4421 2-SAT
- hdu 4421(枚举+2-sat)
- zoj 3656 hdu 4421 (2—SAT)
- 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 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 3715 2-sat
- hdu 3062 2-SAT
- 用补码表示整数及加减运算
- cocos2d中的anchorPoint
- Linux中用ALSA驱动声卡流程详解
- 后缀数组+RMQpoj3693
- 中文555句
- HDU 4421 2-SAT
- 老调重谈,关于java的环境变量配置
- 判断一个数组是否为二叉树的后序遍历
- mp3 ID3 use python
- css中的定位
- 恒生基财事业部面试感想
- Android笔记
- 装Windows 8 过程中遇到的问题,及解决方案
- 如何向 appstore 查询已发布 APP 的信息?